You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by mo...@apache.org on 2017/11/22 04:37:56 UTC
zeppelin git commit: [ZEPPELIN-2995] "auto-restart interpreter on
cron execution" should restart interpreter to specific note,
not all interpreters
Repository: zeppelin
Updated Branches:
refs/heads/master 2d60d0b67 -> 7db9ab472
[ZEPPELIN-2995] "auto-restart interpreter on cron execution" should restart interpreter to specific note, not all interpreters
### What is this PR for?
Make "auto-restart interpreter on cron execution" restart the interpreters which are specific to the note, not all interpreters.
This issue was reported by https://github.com/apache/zeppelin/pull/1302#issuecomment-336521420.
### What type of PR is it?
[Bug Fix]
### Todos
### What is the Jira issue?
* https://issues.apache.org/jira/browse/ZEPPELIN-2995
### How should this be tested?
* Tested Manually.
* I confirmed that the "auto-restart interpreter on cron execution" feature restarted only the interpreters which were specific to the notebook.
### Screenshots (if appropriate)
### Questions:
* Does the licenses files need update? No.
* Is there breaking changes for older versions? No.
* Does this needs documentation? No.
Author: Keiji Yoshida <kj...@gmail.com>
Closes #2681 from kjmrknsn/ZEPPELIN-2995 and squashes the following commits:
43765a5 [Keiji Yoshida] [ZEPPELIN-2995] "auto-restart interpreter on cron execution" should restart interpreter to specific note, not all interpreters
Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo
Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/7db9ab47
Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/7db9ab47
Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/7db9ab47
Branch: refs/heads/master
Commit: 7db9ab47224d29c5f53b81bb65383c3581f8817f
Parents: 2d60d0b
Author: Keiji Yoshida <kj...@gmail.com>
Authored: Mon Nov 20 22:54:39 2017 +0900
Committer: Lee moon soo <mo...@apache.org>
Committed: Tue Nov 21 20:37:47 2017 -0800
----------------------------------------------------------------------
.../org/apache/zeppelin/notebook/Notebook.java | 11 ++-
.../apache/zeppelin/notebook/NotebookTest.java | 82 ++++++++++++++++++++
2 files changed, 90 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/7db9ab47/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java
index 3baf4f1..8de981e 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java
@@ -901,10 +901,14 @@ public class Notebook implements NoteEventListener {
}
boolean releaseResource = false;
+ String cronExecutingUser = null;
try {
Map<String, Object> config = note.getConfig();
- if (config != null && config.containsKey("releaseresource")) {
- releaseResource = (boolean) note.getConfig().get("releaseresource");
+ if (config != null) {
+ if (config.containsKey("releaseresource")) {
+ releaseResource = (boolean) config.get("releaseresource");
+ }
+ cronExecutingUser = (String) config.get("cronExecutingUser");
}
} catch (ClassCastException e) {
logger.error(e.getMessage(), e);
@@ -913,7 +917,8 @@ public class Notebook implements NoteEventListener {
for (InterpreterSetting setting : notebook.getInterpreterSettingManager()
.getInterpreterSettings(note.getId())) {
try {
- notebook.getInterpreterSettingManager().restart(setting.getId());
+ notebook.getInterpreterSettingManager().restart(setting.getId(), noteId,
+ cronExecutingUser != null ? cronExecutingUser : "anonymous");
} catch (InterpreterException e) {
logger.error("Fail to restart interpreter: " + setting.getId(), e);
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/7db9ab47/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java
index 511b4e5..ba9e177 100644
--- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java
+++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java
@@ -451,6 +451,88 @@ public class NotebookTest extends AbstractInterpreterTest implements JobListener
}
@Test
+ public void testCronWithReleaseResourceClosesOnlySpecificInterpreters()
+ throws IOException, InterruptedException {
+ // create a cron scheduled note.
+ Note cronNote = notebook.createNote(anonymous);
+ interpreterSettingManager.setInterpreterBinding(anonymous.getUser(), cronNote.getId(),
+ Arrays.asList(interpreterSettingManager.getInterpreterSettingByName("mock1").getId()));
+ cronNote.setConfig(new HashMap() {
+ {
+ put("cron", "1/5 * * * * ?");
+ put("cronExecutingUser", anonymous.getUser());
+ put("releaseresource", true);
+ }
+ });
+ RemoteInterpreter cronNoteInterpreter =
+ (RemoteInterpreter) interpreterFactory.getInterpreter(anonymous.getUser(),
+ cronNote.getId(), "mock1");
+
+ // create a paragraph of the cron scheduled note.
+ Paragraph cronNoteParagraph = cronNote.addNewParagraph(AuthenticationInfo.ANONYMOUS);
+ cronNoteParagraph.setConfig(new HashMap() {
+ { put("enabled", true); }
+ });
+ cronNoteParagraph.setText("%mock1 sleep 1000");
+
+ // create another note
+ Note anotherNote = notebook.createNote(anonymous);
+ interpreterSettingManager.setInterpreterBinding(anonymous.getUser(), anotherNote.getId(),
+ Arrays.asList(interpreterSettingManager.getInterpreterSettingByName("mock2").getId()));
+ RemoteInterpreter anotherNoteInterpreter =
+ (RemoteInterpreter) interpreterFactory.getInterpreter(anonymous.getUser(),
+ anotherNote.getId(), "mock2");
+
+ // create a paragraph of another note
+ Paragraph anotherNoteParagraph = anotherNote.addNewParagraph(AuthenticationInfo.ANONYMOUS);
+ anotherNoteParagraph.setConfig(new HashMap() {
+ { put("enabled", true); }
+ });
+ anotherNoteParagraph.setText("%mock2 echo 1");
+
+ // run the paragraph of another note
+ anotherNote.run(anotherNoteParagraph.getId());
+
+ // wait until anotherNoteInterpreter is opened
+ while (!anotherNoteInterpreter.isOpened()) {
+ Thread.yield();
+ }
+
+ // refresh the cron schedule
+ notebook.refreshCron(cronNote.getId());
+
+ // wait until cronNoteInterpreter is opened
+ while (!cronNoteInterpreter.isOpened()) {
+ Thread.yield();
+ }
+
+ // wait until cronNoteInterpreter is closed
+ while (cronNoteInterpreter.isOpened()) {
+ Thread.yield();
+ }
+
+ // wait for a few seconds
+ Thread.sleep(5 * 1000);
+
+ // test that anotherNoteInterpreter is still opened
+ assertTrue(anotherNoteInterpreter.isOpened());
+
+ // remove cron scheduler
+ cronNote.setConfig(new HashMap() {
+ {
+ put("cron", null);
+ put("cronExecutingUser", null);
+ put("releaseresource", null);
+ }
+ });
+ notebook.refreshCron(cronNote.getId());
+
+ // remove notebooks
+ notebook.removeNote(cronNote.getId(), anonymous);
+ notebook.removeNote(anotherNote.getId(), anonymous);
+ }
+
+ @Test
public void testExportAndImportNote() throws IOException, CloneNotSupportedException,
InterruptedException, InterpreterException, SchedulerException, RepositoryException {
Note note = notebook.createNote(anonymous);