Skip to content

Commit 8266d12

Browse files
committed
ZEPPELIN-1368. interpreter-setting.json may be loaded mutliple times
1 parent c69d21f commit 8266d12

File tree

2 files changed

+42
-28
lines changed

2 files changed

+42
-28
lines changed

zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Interpreter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -338,9 +338,9 @@ public static void register(String name, String group, String className,
338338
@Deprecated
339339
public static void register(String name, String group, String className,
340340
boolean defaultInterpreter, Map<String, InterpreterProperty> properties) {
341-
logger.error("Static initialization is deprecated. You should change it to use " +
342-
"interpreter-setting.json in your jar or " +
343-
"interpreter/{interpreter}/interpreter-setting.json");
341+
logger.warn("Static initialization is deprecated for interpreter {}, You should change it " +
342+
"to use interpreter-setting.json in your jar or " +
343+
"interpreter/{interpreter}/interpreter-setting.json", name);
344344
register(new RegisteredInterpreter(name, group, className, defaultInterpreter, properties));
345345
}
346346

zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java

Lines changed: 39 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -171,32 +171,42 @@ public boolean accept(Path entry) throws IOException {
171171
})) {
172172
String interpreterDirString = interpreterDir.toString();
173173

174-
registerInterpreterFromPath(interpreterDirString, interpreterJson);
175-
176-
registerInterpreterFromResource(cl, interpreterDirString, interpreterJson);
177-
178-
/*
179-
* TODO(jongyoul)
180-
* - Remove these codes below because of legacy code
181-
* - Support ThreadInterpreter
174+
/**
175+
* Register interpreter by the following ordering
176+
* 1. Register it from path {ZEPPELIN_HOME}/interpreter/{interpreter_name}/
177+
* interpreter-setting.json
178+
* 2. Register it from interpreter-setting.json in classpath
179+
* {ZEPPELIN_HOME}/interpreter/{interpreter_name}
180+
* 3. Register it by Interpreter.register
182181
*/
183-
URLClassLoader ccl = new URLClassLoader(recursiveBuildLibList(interpreterDir.toFile()), cl);
184-
for (String className : interpreterClassList) {
185-
try {
186-
// Load classes
187-
Class.forName(className, true, ccl);
188-
Set<String> interpreterKeys = Interpreter.registeredInterpreters.keySet();
189-
for (String interpreterKey : interpreterKeys) {
190-
if (className
191-
.equals(Interpreter.registeredInterpreters.get(interpreterKey).getClassName())) {
192-
Interpreter.registeredInterpreters.get(interpreterKey)
193-
.setPath(interpreterDirString);
194-
logger.info("Interpreter " + interpreterKey + " found. class=" + className);
195-
cleanCl.put(interpreterDirString, ccl);
182+
if (!registerInterpreterFromPath(interpreterDirString, interpreterJson)) {
183+
if (!registerInterpreterFromResource(cl, interpreterDirString, interpreterJson)) {
184+
/*
185+
* TODO(jongyoul)
186+
* - Remove these codes below because of legacy code
187+
* - Support ThreadInterpreter
188+
*/
189+
URLClassLoader ccl = new URLClassLoader(
190+
recursiveBuildLibList(interpreterDir.toFile()), cl);
191+
for (String className : interpreterClassList) {
192+
try {
193+
// Load classes
194+
Class.forName(className, true, ccl);
195+
Set<String> interpreterKeys = Interpreter.registeredInterpreters.keySet();
196+
for (String interpreterKey : interpreterKeys) {
197+
if (className
198+
.equals(Interpreter.registeredInterpreters.get(interpreterKey)
199+
.getClassName())) {
200+
Interpreter.registeredInterpreters.get(interpreterKey)
201+
.setPath(interpreterDirString);
202+
logger.info("Interpreter " + interpreterKey + " found. class=" + className);
203+
cleanCl.put(interpreterDirString, ccl);
204+
}
205+
}
206+
} catch (Throwable t) {
207+
// nothing to do
196208
}
197209
}
198-
} catch (Throwable t) {
199-
// nothing to do
200210
}
201211
}
202212
}
@@ -277,7 +287,7 @@ private Properties convertInterpreterProperties(Map<String, InterpreterProperty>
277287
return properties;
278288
}
279289

280-
private void registerInterpreterFromResource(ClassLoader cl, String interpreterDir,
290+
private boolean registerInterpreterFromResource(ClassLoader cl, String interpreterDir,
281291
String interpreterJson) throws IOException, RepositoryException {
282292
URL[] urls = recursiveBuildLibList(new File(interpreterDir));
283293
ClassLoader tempClassLoader = new URLClassLoader(urls, cl);
@@ -289,10 +299,12 @@ private void registerInterpreterFromResource(ClassLoader cl, String interpreterD
289299
List<RegisteredInterpreter> registeredInterpreterList =
290300
getInterpreterListFromJson(inputStream);
291301
registerInterpreters(registeredInterpreterList, interpreterDir);
302+
return true;
292303
}
304+
return false;
293305
}
294306

295-
private void registerInterpreterFromPath(String interpreterDir, String interpreterJson)
307+
private boolean registerInterpreterFromPath(String interpreterDir, String interpreterJson)
296308
throws IOException, RepositoryException {
297309

298310
Path interpreterJsonPath = Paths.get(interpreterDir, interpreterJson);
@@ -301,7 +313,9 @@ private void registerInterpreterFromPath(String interpreterDir, String interpret
301313
List<RegisteredInterpreter> registeredInterpreterList =
302314
getInterpreterListFromJson(interpreterJsonPath);
303315
registerInterpreters(registeredInterpreterList, interpreterDir);
316+
return true;
304317
}
318+
return false;
305319
}
306320

307321
private List<RegisteredInterpreter> getInterpreterListFromJson(Path filename)

0 commit comments

Comments
 (0)