From e94467be06a1ea766c3e67b163951d3eae665848 Mon Sep 17 00:00:00 2001 From: Dave Marion Date: Mon, 13 Jun 2016 17:26:41 -0400 Subject: [PATCH] ACCUMULO-4341: Preload classes that will be loaded in the background by the HDFS client --- .../main/java/org/apache/accumulo/start/Main.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/start/src/main/java/org/apache/accumulo/start/Main.java b/start/src/main/java/org/apache/accumulo/start/Main.java index 99e1d5c50a0..1228db92d94 100644 --- a/start/src/main/java/org/apache/accumulo/start/Main.java +++ b/start/src/main/java/org/apache/accumulo/start/Main.java @@ -42,6 +42,15 @@ public class Main { public static void main(final String[] args) { try { + // Preload classes that cause a deadlock between the ServiceLoader and the DFSClient when using + // the VFSClassLoader with jars in HDFS. + ClassLoader loader = getClassLoader(); + Class confClass = AccumuloClassLoader.getClassLoader().loadClass("org.apache.hadoop.conf.Configuration"); + Object conf = confClass.newInstance(); + Method getClassByNameOrNullMethod = conf.getClass().getMethod("getClassByNameOrNull", String.class); + getClassByNameOrNullMethod.invoke(conf, "org.apache.hadoop.mapred.JobConf"); + getClassByNameOrNullMethod.invoke(conf, "org.apache.hadoop.mapred.JobConfigurable"); + if (args.length == 0) { printUsage(); System.exit(1); @@ -49,7 +58,7 @@ public static void main(final String[] args) { // determine whether a keyword was used or a class name, and execute it with the remaining args String keywordOrClassName = args[0]; - KeywordExecutable keywordExec = getExecutables(getClassLoader()).get(keywordOrClassName); + KeywordExecutable keywordExec = getExecutables(loader).get(keywordOrClassName); if (keywordExec != null) { execKeyword(keywordExec, stripArgs(args, 1)); } else { @@ -67,6 +76,7 @@ public static ClassLoader getClassLoader() { try { ClassLoader clTmp = (ClassLoader) getVFSClassLoader().getMethod("getClassLoader").invoke(null); classLoader = clTmp; + Thread.currentThread().setContextClassLoader(classLoader); } catch (ClassNotFoundException | IOException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { log.error("Problem initializing the class loader", e);