Repository: zeppelin Updated Branches: refs/heads/master 6b0f6e7a0 -> 24f81426c
ZEPPELIN-2998. Fix bug in restarting interpreter in scoped mode ### What is this PR for? Fixed the bug mentioned in https://github.com/apache/zeppelin/pull/2554#discussion_r136703878 ### What type of PR is it? [Bug Fix] ### Todos * [ ] - Task ### What is the Jira issue? * https://issues.apache.org/jira/browse/ZEPPELIN-2998 ### How should this be tested? * Unit test is added ### 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: Jeff Zhang <zjf...@apache.org> Closes #2626 from zjffdu/ZEPPELIN-2998 and squashes the following commits: cc11fb6 [Jeff Zhang] ZEPPELIN-2998. Fix bug in restarting interpreter in scoped mode Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/24f81426 Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/24f81426 Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/24f81426 Branch: refs/heads/master Commit: 24f81426cb138d8191f59df8d69dd28867142cd8 Parents: 6b0f6e7 Author: Jeff Zhang <zjf...@apache.org> Authored: Mon Oct 16 20:50:07 2017 +0800 Committer: Jeff Zhang <zjf...@apache.org> Committed: Wed Oct 18 08:31:02 2017 +0800 ---------------------------------------------------------------------- .../interpreter/InterpreterSetting.java | 13 ++-- .../interpreter/InterpreterSettingManager.java | 8 +- .../interpreter/ManagedInterpreterGroup.java | 4 +- .../InterpreterSettingManagerTest.java | 77 +++++++++++++++++++- 4 files changed, 83 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/zeppelin/blob/24f81426/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java index a82d5bf..3b42752 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java @@ -205,10 +205,10 @@ public class InterpreterSetting { return this; } -// public Builder setInterpreterRunner(InterpreterRunner runner) { -// interpreterSetting.interpreterRunner = runner; -// return this; -// } + public Builder setInterpreterRunner(InterpreterRunner runner) { + interpreterSetting.interpreterRunner = runner; + return this; + } public Builder setIntepreterSettingManager( InterpreterSettingManager interpreterSettingManager) { @@ -248,7 +248,6 @@ public class InterpreterSetting { } void postProcessing() { -// createLauncher(); this.status = Status.READY; } @@ -370,7 +369,7 @@ public class InterpreterSetting { try { interpreterGroupWriteLock.lock(); if (!interpreterGroups.containsKey(groupId)) { - LOGGER.info("Create InterpreterGroup with groupId {} for user {} and note {}", + LOGGER.info("Create InterpreterGroup with groupId: {} for user: {} and note: {}", groupId, user, noteId); ManagedInterpreterGroup intpGroup = createInterpreterGroup(groupId); interpreterGroups.put(groupId, intpGroup); @@ -653,7 +652,7 @@ public class InterpreterSetting { return process; } - private List<Interpreter> getOrCreateSession(String user, String noteId) { + List<Interpreter> getOrCreateSession(String user, String noteId) { ManagedInterpreterGroup interpreterGroup = getOrCreateInterpreterGroup(user, noteId); Preconditions.checkNotNull(interpreterGroup, "No InterpreterGroup existed for user {}, " + "noteId {}", user, noteId); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/24f81426/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManager.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManager.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManager.java index f34195d..abaf634 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManager.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManager.java @@ -782,13 +782,7 @@ public class InterpreterSettingManager { //clean up metaInfos intpSetting.setInfos(null); copyDependenciesFromLocalPath(intpSetting); - - if (user.equals("anonymous")) { - intpSetting.close(); - } else { - intpSetting.closeInterpreters(user, noteId); - } - + intpSetting.closeInterpreters(user, noteId); } else { throw new InterpreterException("Interpreter setting id " + settingId + " not found"); } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/24f81426/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/ManagedInterpreterGroup.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/ManagedInterpreterGroup.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/ManagedInterpreterGroup.java index ff9cb1c..96f0195 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/ManagedInterpreterGroup.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/ManagedInterpreterGroup.java @@ -85,7 +85,7 @@ public class ManagedInterpreterGroup extends InterpreterGroup { close(sessions.remove(sessionId)); //TODO(zjffdu) whether close InterpreterGroup if there's no session left in Zeppelin Server if (sessions.isEmpty() && interpreterSetting != null) { - LOGGER.info("Remove this InterpreterGroup {} as all the sessions are closed", id); + LOGGER.info("Remove this InterpreterGroup: {} as all the sessions are closed", id); interpreterSetting.removeInterpreterGroup(id); if (remoteInterpreterProcess != null) { LOGGER.info("Kill RemoteIntetrpreterProcess"); @@ -133,7 +133,7 @@ public class ManagedInterpreterGroup extends InterpreterGroup { for (Interpreter interpreter : interpreters) { interpreter.setInterpreterGroup(this); } - LOGGER.info("Create Session {} in InterpreterGroup {} for user {}", sessionId, id, user); + LOGGER.info("Create Session: {} in InterpreterGroup: {} for user: {}", sessionId, id, user); sessions.put(sessionId, interpreters); return interpreters; } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/24f81426/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterSettingManagerTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterSettingManagerTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterSettingManagerTest.java index 605476f..19f16f5 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterSettingManagerTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterSettingManagerTest.java @@ -34,6 +34,7 @@ import java.util.List; import java.util.Map; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -181,9 +182,6 @@ public class InterpreterSettingManagerTest extends AbstractInterpreterTest { // only close user1's session interpreterSettingManager.restart(interpreterSetting.getId(), "note1", "user1"); assertEquals(2, interpreterGroup.getSessionNum()); - // close all the sessions - interpreterSettingManager.restart(interpreterSetting.getId(), "note1", "anonymous"); - assertEquals(0, interpreterGroup.getSessionNum()); // remove interpreter setting interpreterSettingManager.remove(interpreterSetting.getId()); @@ -281,6 +279,79 @@ public class InterpreterSettingManagerTest extends AbstractInterpreterTest { Interpreter mock1Interpreter = interpreterFactory.getInterpreter("user1", "note1", "mock1"); editor = interpreterSettingManager.getEditorSetting(mock1Interpreter,"user1", "note1", "mock1"); assertEquals("text", editor.get("language")); + } + + @Test + public void testRestartShared() throws InterpreterException { + InterpreterSetting interpreterSetting = interpreterSettingManager.getByName("test"); + interpreterSetting.getOption().setPerUser("shared"); + interpreterSetting.getOption().setPerNote("shared"); + + interpreterSetting.getOrCreateSession("user1", "note1"); + interpreterSetting.getOrCreateInterpreterGroup("user2", "note2"); + assertEquals(1, interpreterSetting.getAllInterpreterGroups().size()); + + interpreterSettingManager.restart(interpreterSetting.getId(), "user1", "note1"); + assertEquals(0, interpreterSetting.getAllInterpreterGroups().size()); + } + + @Test + public void testRestartPerUserIsolated() throws InterpreterException { + InterpreterSetting interpreterSetting = interpreterSettingManager.getByName("test"); + interpreterSetting.getOption().setPerUser("isolated"); + interpreterSetting.getOption().setPerNote("shared"); + + interpreterSetting.getOrCreateSession("user1", "note1"); + interpreterSetting.getOrCreateSession("user2", "note2"); + assertEquals(2, interpreterSetting.getAllInterpreterGroups().size()); + + interpreterSettingManager.restart(interpreterSetting.getId(), "note1", "user1"); + assertEquals(1, interpreterSetting.getAllInterpreterGroups().size()); + } + + @Test + public void testRestartPerNoteIsolated() throws InterpreterException { + InterpreterSetting interpreterSetting = interpreterSettingManager.getByName("test"); + interpreterSetting.getOption().setPerUser("shared"); + interpreterSetting.getOption().setPerNote("isolated"); + interpreterSetting.getOrCreateSession("user1", "note1"); + interpreterSetting.getOrCreateSession("user2", "note2"); + assertEquals(2, interpreterSetting.getAllInterpreterGroups().size()); + + interpreterSettingManager.restart(interpreterSetting.getId(), "note1", "user1"); + assertEquals(1, interpreterSetting.getAllInterpreterGroups().size()); + } + + @Test + public void testRestartPerUserScoped() throws InterpreterException { + InterpreterSetting interpreterSetting = interpreterSettingManager.getByName("test"); + interpreterSetting.getOption().setPerUser("scoped"); + interpreterSetting.getOption().setPerNote("shared"); + + interpreterSetting.getOrCreateSession("user1", "note1"); + interpreterSetting.getOrCreateSession("user2", "note2"); + assertEquals(1, interpreterSetting.getAllInterpreterGroups().size()); + assertEquals(2, interpreterSetting.getAllInterpreterGroups().get(0).getSessionNum()); + + interpreterSettingManager.restart(interpreterSetting.getId(), "note1", "user1"); + assertEquals(1, interpreterSetting.getAllInterpreterGroups().size()); + assertEquals(1, interpreterSetting.getAllInterpreterGroups().get(0).getSessionNum()); + } + + @Test + public void testRestartPerNoteScoped() throws InterpreterException { + InterpreterSetting interpreterSetting = interpreterSettingManager.getByName("test"); + interpreterSetting.getOption().setPerUser("shared"); + interpreterSetting.getOption().setPerNote("scoped"); + + interpreterSetting.getOrCreateSession("user1", "note1"); + interpreterSetting.getOrCreateSession("user2", "note2"); + assertEquals(1, interpreterSetting.getAllInterpreterGroups().size()); + assertEquals(2, interpreterSetting.getAllInterpreterGroups().get(0).getSessionNum()); + + interpreterSettingManager.restart(interpreterSetting.getId(), "note1", "user1"); + assertEquals(1, interpreterSetting.getAllInterpreterGroups().size()); + assertEquals(1, interpreterSetting.getAllInterpreterGroups().get(0).getSessionNum()); } }