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) {