Author: llu Date: Fri Aug 12 16:57:23 2011 New Revision: 1157187 URL: http://svn.apache.org/viewvc?rev=1157187&view=rev Log: HADOOP-7529. Fix lock cycles in metrics system. (llu)
Modified: hadoop/common/trunk/hadoop-common/CHANGES.txt hadoop/common/trunk/hadoop-common/src/main/java/org/apache/hadoop/metrics2/lib/DefaultMetricsSystem.java Modified: hadoop/common/trunk/hadoop-common/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common/CHANGES.txt?rev=1157187&r1=1157186&r2=1157187&view=diff ============================================================================== --- hadoop/common/trunk/hadoop-common/CHANGES.txt (original) +++ hadoop/common/trunk/hadoop-common/CHANGES.txt Fri Aug 12 16:57:23 2011 @@ -493,6 +493,8 @@ Trunk (unreleased changes) HADOOP-6622. Token should not print the password in toString. (eli) + HADOOP-7529. Fix lock cycles in metrics system. (llu) + Release 0.22.0 - Unreleased INCOMPATIBLE CHANGES Modified: hadoop/common/trunk/hadoop-common/src/main/java/org/apache/hadoop/metrics2/lib/DefaultMetricsSystem.java URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common/src/main/java/org/apache/hadoop/metrics2/lib/DefaultMetricsSystem.java?rev=1157187&r1=1157186&r2=1157187&view=diff ============================================================================== --- hadoop/common/trunk/hadoop-common/src/main/java/org/apache/hadoop/metrics2/lib/DefaultMetricsSystem.java (original) +++ hadoop/common/trunk/hadoop-common/src/main/java/org/apache/hadoop/metrics2/lib/DefaultMetricsSystem.java Fri Aug 12 16:57:23 2011 @@ -18,6 +18,7 @@ package org.apache.hadoop.metrics2.lib; +import java.util.concurrent.atomic.AtomicReference; import javax.management.ObjectName; import org.apache.hadoop.classification.InterfaceAudience; @@ -34,7 +35,8 @@ import org.apache.hadoop.metrics2.impl.M public enum DefaultMetricsSystem { INSTANCE; // the singleton - private MetricsSystem impl = new MetricsSystemImpl(); + private AtomicReference<MetricsSystem> impl = + new AtomicReference<MetricsSystem>(new MetricsSystemImpl()); volatile boolean miniClusterMode = false; final UniqueNames mBeanNames = new UniqueNames(); final UniqueNames sourceNames = new UniqueNames(); @@ -48,8 +50,8 @@ public enum DefaultMetricsSystem { return INSTANCE.init(prefix); } - synchronized MetricsSystem init(String prefix) { - return impl.init(prefix); + MetricsSystem init(String prefix) { + return impl.get().init(prefix); } /** @@ -66,8 +68,9 @@ public enum DefaultMetricsSystem { INSTANCE.shutdownInstance(); } - synchronized void shutdownInstance() { - if (impl.shutdown()) { + void shutdownInstance() { + boolean last = impl.get().shutdown(); + if (last) synchronized(this) { mBeanNames.map.clear(); sourceNames.map.clear(); } @@ -78,13 +81,11 @@ public enum DefaultMetricsSystem { return INSTANCE.setImpl(ms); } - synchronized MetricsSystem setImpl(MetricsSystem ms) { - MetricsSystem old = impl; - impl = ms; - return old; + MetricsSystem setImpl(MetricsSystem ms) { + return impl.getAndSet(ms); } - synchronized MetricsSystem getImpl() { return impl; } + MetricsSystem getImpl() { return impl.get(); } @InterfaceAudience.Private public static void setMiniClusterMode(boolean choice) {