diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 4bcca2eeb05..b4bb7d5963c 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -239,6 +239,9 @@ Release 2.5.0 - UNRELEASED HADOOP-10716. Cannot use more than 1 har filesystem. (Rushabh Shah via cnauroth) + HADOOP-9559. When metrics system is restarted MBean names get incorrectly + flagged as dupes. (Mostafa Elhemali and Mike Liddell via cnauroth) + BREAKDOWN OF HADOOP-10514 SUBTASKS AND RELATED JIRAS HADOOP-10520. Extended attributes definition and FileSystem APIs for diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSourceAdapter.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSourceAdapter.java index 8fe92d86d63..de1b28c2a31 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSourceAdapter.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSourceAdapter.java @@ -30,6 +30,7 @@ import javax.management.ObjectName; import javax.management.ReflectionException; import static com.google.common.base.Preconditions.*; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Maps; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -227,7 +228,13 @@ class MetricsSourceAdapter implements DynamicMBean { mbeanName = null; } } + + @VisibleForTesting + ObjectName getMBeanName() { + return mbeanName; + } + private void updateInfoCache() { LOG.debug("Updating info cache..."); infoCache = infoBuilder.reset(lastRecs).get(); diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSystemImpl.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSystemImpl.java index 15a5c6c7095..6267a7b3d76 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSystemImpl.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSystemImpl.java @@ -32,6 +32,7 @@ import javax.management.ObjectName; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.google.common.annotations.VisibleForTesting; import java.util.Locale; import static com.google.common.base.Preconditions.*; @@ -577,6 +578,11 @@ public class MetricsSystemImpl extends MetricsSystem implements MetricsSource { return allSources.get(name); } + @VisibleForTesting + MetricsSourceAdapter getSourceAdapter(String name) { + return sources.get(name); + } + private InitMode initMode() { LOG.debug("from system property: "+ System.getProperty(MS_INIT_MODE_KEY)); LOG.debug("from environment variable: "+ System.getenv(MS_INIT_MODE_KEY)); diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/lib/DefaultMetricsSystem.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/lib/DefaultMetricsSystem.java index 485f11d2666..d3a5508393e 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/lib/DefaultMetricsSystem.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/lib/DefaultMetricsSystem.java @@ -102,6 +102,11 @@ public enum DefaultMetricsSystem { return INSTANCE.newObjectName(name); } + @InterfaceAudience.Private + public static void removeMBeanName(ObjectName name) { + INSTANCE.removeObjectName(name.toString()); + } + @InterfaceAudience.Private public static String sourceName(String name, boolean dupOK) { return INSTANCE.newSourceName(name, dupOK); @@ -118,6 +123,10 @@ public enum DefaultMetricsSystem { } } + synchronized void removeObjectName(String name) { + mBeanNames.map.remove(name); + } + synchronized String newSourceName(String name, boolean dupOK) { if (sourceNames.map.containsKey(name)) { if (dupOK) { diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/util/MBeans.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/util/MBeans.java index 73c2109b308..7fd420572f0 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/util/MBeans.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/util/MBeans.java @@ -82,6 +82,7 @@ public class MBeans { } catch (Exception e) { LOG.warn("Error unregistering "+ mbeanName, e); } + DefaultMetricsSystem.removeMBeanName(mbeanName); } static private ObjectName getMBeanName(String serviceName, String nameName) { diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/impl/TestMetricsSystemImpl.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/impl/TestMetricsSystemImpl.java index 49a54af5998..564214bba65 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/impl/TestMetricsSystemImpl.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/impl/TestMetricsSystemImpl.java @@ -360,6 +360,24 @@ public class TestMetricsSystemImpl { ms.register(ts); } + @Test public void testStartStopStart() { + DefaultMetricsSystem.shutdown(); // Clear pre-existing source names. + MetricsSystemImpl ms = new MetricsSystemImpl("test"); + TestSource ts = new TestSource("ts"); + ms.start(); + ms.register("ts", "", ts); + MetricsSourceAdapter sa = ms.getSourceAdapter("ts"); + assertNotNull(sa); + assertNotNull(sa.getMBeanName()); + ms.stop(); + ms.shutdown(); + ms.start(); + sa = ms.getSourceAdapter("ts"); + assertNotNull(sa); + assertNotNull(sa.getMBeanName()); + ms.stop(); + ms.shutdown(); + } private void checkMetricsRecords(List recs) { LOG.debug(recs);