Repository: incubator-zeppelin Updated Branches: refs/heads/master 4f186733d -> 45ce8a288
Auto-restart interpreters on cron execution. ### What is this PR for? Release resource after cron schedule job. ### What type of PR is it? Improvement ### Todos * [x] - add check-box for release resource to the zeppelin-web. * [x] - add release resource(interpreter restart) function to notebook. ### Is there a relevant Jira issue? https://issues.apache.org/jira/browse/ZEPPELIN-524. ### How should this be tested? please refer to the screenshots. ### 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: astroshim <[email protected]> Closes #557 from astroshim/ZEPPELIN-524 and squashes the following commits: c27b9db [astroshim] remove unused class 8b0178e [astroshim] change sentence and add testcase ef510c7 [astroshim] release resource after cron job. Project: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/commit/45ce8a28 Tree: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/tree/45ce8a28 Diff: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/diff/45ce8a28 Branch: refs/heads/master Commit: 45ce8a288b0faac54b588c82c2406eee0b5eb3db Parents: 4f18673 Author: astroshim <[email protected]> Authored: Sat Dec 26 04:19:41 2015 +0900 Committer: Lee moon soo <[email protected]> Committed: Tue Dec 29 18:28:20 2015 -0800 ---------------------------------------------------------------------- .../src/app/notebook/notebook-actionBar.html | 6 +++ .../src/app/notebook/notebook.controller.js | 6 +++ .../org/apache/zeppelin/notebook/Notebook.java | 20 ++++++++++ .../apache/zeppelin/notebook/NotebookTest.java | 42 ++++++++++++++++++++ 4 files changed, 74 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/45ce8a28/zeppelin-web/src/app/notebook/notebook-actionBar.html ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/app/notebook/notebook-actionBar.html b/zeppelin-web/src/app/notebook/notebook-actionBar.html index dc99e1d..360b8f7 100644 --- a/zeppelin-web/src/app/notebook/notebook-actionBar.html +++ b/zeppelin-web/src/app/notebook/notebook-actionBar.html @@ -100,6 +100,12 @@ limitations under the License. {{note.info.cron}} </p> </div> + <div> + <span>- auto-restart interpreter on cron execution </span> + <input type="checkbox" + ng-model="note.config.releaseresource" + ng-click="setReleaseResource(note.config.releaseresource)"> + </div> </div> </li> </ul> http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/45ce8a28/zeppelin-web/src/app/notebook/notebook.controller.js ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js b/zeppelin-web/src/app/notebook/notebook.controller.js index 89d7d7d..9030a49 100644 --- a/zeppelin-web/src/app/notebook/notebook.controller.js +++ b/zeppelin-web/src/app/notebook/notebook.controller.js @@ -282,6 +282,12 @@ angular.module('zeppelinWebApp').controller('NotebookCtrl', $scope.setConfig(); }; + /** Set release resource for this note **/ + $scope.setReleaseResource = function(value) { + $scope.note.config.releaseresource = value; + $scope.setConfig(); + }; + /** Update note config **/ $scope.setConfig = function(config) { if(config) { http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/45ce8a28/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 dcde50f..79d0a0d 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 @@ -413,6 +413,26 @@ public class Notebook { String noteId = context.getJobDetail().getJobDataMap().getString("noteId"); Note note = notebook.getNote(noteId); note.runAll(); + + while (!note.getLastParagraph().isTerminated()) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + boolean releaseResource = false; + try { + releaseResource = (boolean) note.getConfig().get("releaseresource"); + } catch (java.lang.ClassCastException e) { + e.printStackTrace(); + } + if (releaseResource) { + for (InterpreterSetting setting : note.getNoteReplLoader().getInterpreterSettings()) { + notebook.getInterpreterFactory().restart(setting.id()); + } + } } } http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/45ce8a28/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 e2d1aac..a9cd30f 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 @@ -38,6 +38,7 @@ import org.apache.zeppelin.conf.ZeppelinConfiguration.ConfVars; import org.apache.zeppelin.display.AngularObjectRegistry; import org.apache.zeppelin.interpreter.InterpreterFactory; import org.apache.zeppelin.interpreter.InterpreterOption; +import org.apache.zeppelin.interpreter.InterpreterSetting; import org.apache.zeppelin.interpreter.mock.MockInterpreter1; import org.apache.zeppelin.interpreter.mock.MockInterpreter2; import org.apache.zeppelin.notebook.repo.NotebookRepo; @@ -250,6 +251,47 @@ public class NotebookTest implements JobListenerFactory{ } @Test + public void testAutoRestartInterpreterAfterSchedule() throws InterruptedException, IOException{ + // create a note and a paragraph + Note note = notebook.createNote(); + note.getNoteReplLoader().setInterpreters(factory.getDefaultInterpreterSettingList()); + + Paragraph p = note.addParagraph(); + Map config = new HashMap<String, Object>(); + p.setConfig(config); + p.setText("p1"); + + // set cron scheduler, once a second + config = note.getConfig(); + config.put("enabled", true); + config.put("cron", "* * * * * ?"); + config.put("releaseresource", "true"); + note.setConfig(config); + notebook.refreshCron(note.id()); + while (p.getStatus() != Status.FINISHED) { + Thread.sleep(100); + } + Date dateFinished = p.getDateFinished(); + assertNotNull(dateFinished); + + // restart interpreter + for (InterpreterSetting setting : note.getNoteReplLoader().getInterpreterSettings()) { + notebook.getInterpreterFactory().restart(setting.id()); + } + + Thread.sleep(1000); + while (p.getStatus() != Status.FINISHED) { + Thread.sleep(100); + } + assertNotEquals(dateFinished, p.getDateFinished()); + + // remove cron scheduler. + config.put("cron", null); + note.setConfig(config); + notebook.refreshCron(note.id()); + } + + @Test public void testCloneNote() throws IOException, CloneNotSupportedException, InterruptedException { Note note = notebook.createNote();
