diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java index ab7ff0bd40cc2..fb8e44f542b46 100755 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java @@ -320,7 +320,7 @@ private static boolean getRestrictParserDefault(Object resource) { /** * Configuration objects. */ - private static final WeakHashMap REGISTRY = + private static WeakHashMap REGISTRY = new WeakHashMap(); /** @@ -828,9 +828,7 @@ public Configuration() { public Configuration(boolean loadDefaults) { this.loadDefaults = loadDefaults; - synchronized(Configuration.class) { - REGISTRY.put(this, null); - } + registerConfiguration(this); } /** @@ -864,18 +862,43 @@ public Configuration(Configuration other) { this.propertyTagsMap.putAll(other.propertyTagsMap); } - synchronized(Configuration.class) { - REGISTRY.put(this, null); - } + registerConfiguration(this); + this.classLoader = other.classLoader; this.loadDefaults = other.loadDefaults; setQuietMode(other.getQuietMode()); } + /** + * Registers the configuration to enable reloading. + */ + private static void registerConfiguration(Configuration conf) { + WeakHashMap registry = REGISTRY; + if (registry != null) { + synchronized (Configuration.class) { + registry.put(conf, null); + } + } + } + + public static synchronized void setConfigurationRegistryEnabled(boolean enable) { + if (enable) { + if (REGISTRY == null) { + REGISTRY = new WeakHashMap(); + } + } else { + REGISTRY = null; + } + } + /** * Reload existing configuration instances. */ public static synchronized void reloadExistingConfigurations() { + if (REGISTRY == null) { + LOG.debug("Configuration registry is disabled!"); + return; + } if (LOG.isDebugEnabled()) { LOG.debug("Reloading " + REGISTRY.keySet().size() + " existing configurations"); @@ -891,11 +914,14 @@ public static synchronized void reloadExistingConfigurations() { * @param name file name. File should be present in the classpath. */ public static synchronized void addDefaultResource(String name) { + WeakHashMap registry = REGISTRY; if(!defaultResources.contains(name)) { defaultResources.add(name); - for(Configuration conf : REGISTRY.keySet()) { - if(conf.loadDefaults) { - conf.reloadConfiguration(); + if (registry != null) { + for (Configuration conf : registry.keySet()) { + if (conf.loadDefaults) { + conf.reloadConfiguration(); + } } } } diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfiguration.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfiguration.java index b3487ef309fc9..b4d303edb58f0 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfiguration.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfiguration.java @@ -46,6 +46,9 @@ import java.util.Properties; import java.util.Random; import java.util.Set; +import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Pattern; import static java.util.concurrent.TimeUnit.*; @@ -65,6 +68,7 @@ import static org.junit.Assert.*; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.concurrent.AtomicInitializer; import org.apache.hadoop.conf.Configuration.IntegerRanges; import org.apache.hadoop.fs.FileUtil; import org.apache.hadoop.fs.Path; @@ -2716,4 +2720,27 @@ public void testConcurrentModificationDuringIteration() throws InterruptedExcept assertFalse("ConcurrentModificationException occurred", exceptionOccurred.get()); } + + @Test + public void testReloadingCanBeDisabled() { + try { + AtomicInteger reloadCount = new AtomicInteger(0); + Configuration config = new Configuration() { + @Override + public synchronized void reloadConfiguration() { + reloadCount.incrementAndGet(); + } + }; + assertThat(reloadCount.get(), is(0)); + Configuration.reloadExistingConfigurations(); + assertThat(reloadCount.get(), is(1)); + Configuration.setConfigurationRegistryEnabled(false); + assertThat(reloadCount.get(), is(1)); + Configuration.reloadExistingConfigurations(); + assertThat(reloadCount.get(), is(1)); + + } finally { + Configuration.setConfigurationRegistryEnabled(true); + } + } }