You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by jo...@apache.org on 2017/02/11 06:31:57 UTC

zeppelin git commit: [ZEPPELIN-1972] Preserve context classloader

Repository: zeppelin
Updated Branches:
  refs/heads/master 72f62c4c3 -> 859d175a5


[ZEPPELIN-1972] Preserve context classloader

### What is this PR for?
`IMain.interpret` changes current thread's context classloader. It may cause different issues and definitely is the reason of [ZEPPELIN-1738](https://issues.apache.org/jira/browse/ZEPPELIN-1738) test failures.

It's a known scala bug. See https://issues.scala-lang.org/browse/SI-9587

As a workaround we need to save and restore context classloader manually

### What type of PR is it?
Bug Fix

### What is the Jira issue?
[ZEPPELIN-1972](https://issues.apache.org/jira/browse/ZEPPELIN-1972)

### How should this be tested?
Run ignite interpreter test and ignite sql interpreter test in the same thread
```
mvn test -pl ignite -am -Pscala-2.11 -Dtest=org.apache.zeppelin.ignite.IgniteInterpreterTest#testInterpret,org.apache.zeppelin.ignite.IgniteSqlInterpreterTest#testSql -DfailIfNoTests=false
```

### Questions:
* Does the licenses files need update? No
* Is there breaking changes for older versions? No
* Does this needs documentation? No

Author: Igor Drozdov <ig...@epam.com>

Closes #1911 from DrIgor/ZEPPELIN-1972 and squashes the following commits:

35c5abd [Igor Drozdov] Preserve context classloader


Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo
Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/859d175a
Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/859d175a
Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/859d175a

Branch: refs/heads/master
Commit: 859d175a50a4acd8c8510f27356bed52c33997e5
Parents: 72f62c4
Author: Igor Drozdov <ig...@epam.com>
Authored: Mon Jan 16 12:19:35 2017 +0300
Committer: Jongyoul Lee <jo...@apache.org>
Committed: Sat Feb 11 15:31:35 2017 +0900

----------------------------------------------------------------------
 .../zeppelin/ignite/IgniteInterpreter.java      | 22 +++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zeppelin/blob/859d175a/ignite/src/main/java/org/apache/zeppelin/ignite/IgniteInterpreter.java
----------------------------------------------------------------------
diff --git a/ignite/src/main/java/org/apache/zeppelin/ignite/IgniteInterpreter.java b/ignite/src/main/java/org/apache/zeppelin/ignite/IgniteInterpreter.java
index a44b6ef..0b022fa 100644
--- a/ignite/src/main/java/org/apache/zeppelin/ignite/IgniteInterpreter.java
+++ b/ignite/src/main/java/org/apache/zeppelin/ignite/IgniteInterpreter.java
@@ -200,15 +200,20 @@ public class IgniteInterpreter extends Interpreter {
   }
 
   private void initIgnite() {
-    imain.interpret("@transient var _binder = new java.util.HashMap[String, Object]()");
-    Map<String, Object> binder = (Map<String, Object>) getLastObject();
+    ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+    try {
+      imain.interpret("@transient var _binder = new java.util.HashMap[String, Object]()");
+      Map<String, Object> binder = (Map<String, Object>) getLastObject();
 
-    if (getIgnite() != null) {
-      binder.put("ignite", ignite);
+      if (getIgnite() != null) {
+        binder.put("ignite", ignite);
 
-      imain.interpret("@transient val ignite = "
-              + "_binder.get(\"ignite\")"
-              + ".asInstanceOf[org.apache.ignite.Ignite]");
+        imain.interpret("@transient val ignite = "
+            + "_binder.get(\"ignite\")"
+            + ".asInstanceOf[org.apache.ignite.Ignite]");
+      }
+    } finally {
+      Thread.currentThread().setContextClassLoader(contextClassLoader);
     }
   }
 
@@ -279,11 +284,14 @@ public class IgniteInterpreter extends Interpreter {
         }
       }
 
+      ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
       try {
         code = getResultCode(imain.interpret(incomplete + s));
       } catch (Exception e) {
         logger.info("Interpreter exception", e);
         return new InterpreterResult(Code.ERROR, InterpreterUtils.getMostRelevantMessage(e));
+      } finally {
+        Thread.currentThread().setContextClassLoader(contextClassLoader);
       }
 
       if (code == Code.ERROR) {