diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index d406796616..fe80214f79 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -582,6 +582,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 23c4492663..cf11e6db14 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.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; @@ -226,7 +227,13 @@ synchronized void stopMBeans() { 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 e386ce608f..cf2dda4e38 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 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.*; @@ -573,6 +574,11 @@ public MetricsSource getSource(String name) { 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 be785b9854..c761b58393 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 @@ -110,6 +110,11 @@ public static ObjectName newMBeanName(String name) { 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); @@ -126,6 +131,10 @@ synchronized ObjectName newObjectName(String name) { } } + 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 8f2c01209c..aec9dad40c 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 @@ -84,6 +84,7 @@ static public void unregister(ObjectName mbeanName) { } 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 49a54af599..564214bba6 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 void flush() { 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);