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 fd016e0fa1..887b7edf87 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 @@ -244,12 +244,12 @@ public class InterpreterSetting { } } - void closeAndRemoveInterpreterGroupByUser(String user) { + void closeAndRemoveInterpreterGroup(String noteId, String user) { if (user.equals("anonymous")) { user = ""; } - String processKey = getInterpreterProcessKey(user, ""); - String sessionKey = getInterpreterSessionKey(user, ""); + String processKey = getInterpreterProcessKey(user, noteId); + String sessionKey = getInterpreterSessionKey(user, noteId); List groupToRemove = new LinkedList<>(); InterpreterGroup groupItem; for (String intpKey : new HashSet<>(interpreterGroupRef.keySet())) { 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 c8f3e6a920..dab2c864f4 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 @@ -948,7 +948,7 @@ public class InterpreterSettingManager { if (user.equals("anonymous")) { intpSetting.closeAndRemoveAllInterpreterGroups(); } else { - intpSetting.closeAndRemoveInterpreterGroupByUser(user); + intpSetting.closeAndRemoveInterpreterGroup(noteId, user); } } else { diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterFactoryTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterFactoryTest.java index 711f957e45..3d0fe1ad81 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterFactoryTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterFactoryTest.java @@ -224,7 +224,7 @@ public class InterpreterFactoryTest { LazyOpenInterpreter interpreter2 = (LazyOpenInterpreter)interpreterGroup.get("user2").get(0); interpreter2.open(); - mock1Setting.closeAndRemoveInterpreterGroupByUser("user1"); + mock1Setting.closeAndRemoveInterpreterGroup("sharedProcess", "user1"); assertFalse(interpreter1.isOpen()); assertTrue(interpreter2.isOpen()); } @@ -270,7 +270,7 @@ public class InterpreterFactoryTest { LazyOpenInterpreter interpreter2 = (LazyOpenInterpreter)interpreterGroup2.get("shared_session").get(0); interpreter2.open(); - mock1Setting.closeAndRemoveInterpreterGroupByUser("user1"); + mock1Setting.closeAndRemoveInterpreterGroup("note1", "user1"); assertFalse(interpreter1.isOpen()); assertTrue(interpreter2.isOpen()); } diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterSettingTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterSettingTest.java index 7e40a1b5e8..95ea83761f 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterSettingTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterSettingTest.java @@ -43,7 +43,7 @@ public class InterpreterSettingTest { assertEquals(1, interpreterSetting.getInterpreterGroup("user1", "note1").size()); - interpreterSetting.closeAndRemoveInterpreterGroupByUser("user2"); + interpreterSetting.closeAndRemoveInterpreterGroup("note1", "user2"); assertEquals(0, interpreterSetting.getAllInterpreterGroups().size()); } @@ -77,14 +77,14 @@ public class InterpreterSettingTest { assertEquals(2, interpreterSetting.getInterpreterGroup("user1", "note1").size()); assertEquals(2, interpreterSetting.getInterpreterGroup("user2", "note1").size()); - interpreterSetting.closeAndRemoveInterpreterGroupByUser("user1"); + interpreterSetting.closeAndRemoveInterpreterGroup("note1", "user1"); assertEquals(1, interpreterSetting.getInterpreterGroup("user2","note1").size()); // Check if non-existed key works or not - interpreterSetting.closeAndRemoveInterpreterGroupByUser("user1"); + interpreterSetting.closeAndRemoveInterpreterGroup("note1", "user1"); assertEquals(1, interpreterSetting.getInterpreterGroup("user2","note1").size()); - interpreterSetting.closeAndRemoveInterpreterGroupByUser("user2"); + interpreterSetting.closeAndRemoveInterpreterGroup("note1", "user2"); assertEquals(0, interpreterSetting.getAllInterpreterGroups().size()); } @@ -118,11 +118,52 @@ public class InterpreterSettingTest { assertEquals(1, interpreterSetting.getInterpreterGroup("user1", "note1").size()); assertEquals(1, interpreterSetting.getInterpreterGroup("user2", "note1").size()); - interpreterSetting.closeAndRemoveInterpreterGroupByUser("user1"); + interpreterSetting.closeAndRemoveInterpreterGroup("note1", "user1"); assertEquals(1, interpreterSetting.getInterpreterGroup("user2","note1").size()); assertEquals(1, interpreterSetting.getAllInterpreterGroups().size()); - interpreterSetting.closeAndRemoveInterpreterGroupByUser("user2"); + interpreterSetting.closeAndRemoveInterpreterGroup("note1", "user2"); + assertEquals(0, interpreterSetting.getAllInterpreterGroups().size()); + } + + @Test + public void perNoteScopedModeCloseAndRemoveInterpreterGroupTest() { + InterpreterOption interpreterOption = new InterpreterOption(); + interpreterOption.setPerNote(InterpreterOption.SCOPED); + InterpreterSetting interpreterSetting = new InterpreterSetting("", "", "", new ArrayList(), new Properties(), new ArrayList(), interpreterOption, "", null); + + interpreterSetting.setInterpreterGroupFactory(new InterpreterGroupFactory() { + @Override + public InterpreterGroup createInterpreterGroup(String interpreterGroupId, + InterpreterOption option) { + return new InterpreterGroup(interpreterGroupId); + } + }); + + Interpreter mockInterpreter1 = mock(RemoteInterpreter.class); + List interpreterList1 = new ArrayList<>(); + interpreterList1.add(mockInterpreter1); + InterpreterGroup interpreterGroup = interpreterSetting.getInterpreterGroup("user1", "note1"); + interpreterGroup.put(interpreterSetting.getInterpreterSessionKey("user1", "note1"), interpreterList1); + + Interpreter mockInterpreter2 = mock(RemoteInterpreter.class); + List interpreterList2 = new ArrayList<>(); + interpreterList2.add(mockInterpreter2); + interpreterGroup = interpreterSetting.getInterpreterGroup("user1", "note2"); + interpreterGroup.put(interpreterSetting.getInterpreterSessionKey("user1", "note2"), interpreterList2); + + assertEquals(1, interpreterSetting.getAllInterpreterGroups().size()); + assertEquals(2, interpreterSetting.getInterpreterGroup("user1", "note1").size()); + assertEquals(2, interpreterSetting.getInterpreterGroup("user1", "note2").size()); + + interpreterSetting.closeAndRemoveInterpreterGroup("note1", "user1"); + assertEquals(1, interpreterSetting.getInterpreterGroup("user1","note2").size()); + + // Check if non-existed key works or not + interpreterSetting.closeAndRemoveInterpreterGroup("note1", "user1"); + assertEquals(1, interpreterSetting.getInterpreterGroup("user1","note2").size()); + + interpreterSetting.closeAndRemoveInterpreterGroup("note2", "user1"); assertEquals(0, interpreterSetting.getAllInterpreterGroups().size()); } }