From b566a4f9bcbaca3948a8fcb20b19c18fcf4d5052 Mon Sep 17 00:00:00 2001 From: Josh Elser Date: Tue, 16 Jul 2019 17:10:27 -0400 Subject: [PATCH] HBASE-22701 Disable the DynamicClassLoader when it fails to initialize Signed-off-by: Ankit Singhal --- .../hadoop/hbase/util/DynamicClassLoader.java | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java index 07ca3485c25..7f9e08c3710 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java @@ -69,7 +69,10 @@ public class DynamicClassLoader extends ClassLoaderBase { private static final String DYNAMIC_JARS_OPTIONAL_CONF_KEY = "hbase.use.dynamic.jars"; private static final boolean DYNAMIC_JARS_OPTIONAL_DEFAULT = true; - private boolean useDynamicJars; + // The user-provided value for using the DynamicClassLoader + private final boolean userConfigUseDynamicJars; + // The current state of whether to use the DynamicClassLoader + private final boolean useDynamicJars; private File localDir; @@ -91,12 +94,23 @@ public class DynamicClassLoader extends ClassLoaderBase { final Configuration conf, final ClassLoader parent) { super(parent); - useDynamicJars = conf.getBoolean( + // Save off the user's original configuration value for the DynamicClassLoader + userConfigUseDynamicJars = conf.getBoolean( DYNAMIC_JARS_OPTIONAL_CONF_KEY, DYNAMIC_JARS_OPTIONAL_DEFAULT); - if (useDynamicJars) { - initTempDir(conf); + boolean dynamicJarsEnabled = userConfigUseDynamicJars; + if (dynamicJarsEnabled) { + try { + initTempDir(conf); + dynamicJarsEnabled = true; + } catch (Exception e) { + LOG.error("Disabling the DynamicClassLoader as it failed to initialize its temp directory." + + " Check your configuration and filesystem permissions. Custom coprocessor code may" + + " not be loaded as a result of this failure.", e); + dynamicJarsEnabled = false; + } } + useDynamicJars = dynamicJarsEnabled; } // FindBugs: Making synchronized to avoid IS2_INCONSISTENT_SYNC complaints about @@ -132,12 +146,13 @@ public class DynamicClassLoader extends ClassLoaderBase { try { return parent.loadClass(name); } catch (ClassNotFoundException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Class " + name + " not found - using dynamical class loader"); - } - if (useDynamicJars) { + LOG.debug("Class " + name + " not found - using dynamical class loader"); return tryRefreshClass(name); + } else if (userConfigUseDynamicJars) { + // If the user tried to enable the DCL, then warn again. + LOG.debug("Not checking DynamicClassLoader for missing class because it is disabled." + + " See the log for previous errors."); } throw e; }