From 14b3c2695b152285ed2919f2aa5a25e247c47871 Mon Sep 17 00:00:00 2001 From: John Zhuge Date: Mon, 16 Oct 2017 13:29:29 -0700 Subject: [PATCH] HADOOP-14954. MetricsSystemImpl#init should increment refCount when already initialized. Contributed by John Zhuge. --- .../metrics2/impl/MetricsSystemImpl.java | 12 ++++- .../metrics2/impl/TestMetricsSystemImpl.java | 46 +++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) 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 ee1672ef0c3..c507a77a996 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 @@ -140,6 +140,16 @@ public class MetricsSystemImpl extends MetricsSystem implements MetricsSource { this(null); } + @VisibleForTesting + boolean isMonitoring() { + return monitoring; + } + + @VisibleForTesting + int getRefCount() { + return refCount; + } + /** * Initialized the metrics system with a prefix. * @param prefix the system will look for configs with the prefix @@ -147,12 +157,12 @@ public class MetricsSystemImpl extends MetricsSystem implements MetricsSource { */ @Override public synchronized MetricsSystem init(String prefix) { + ++refCount; if (monitoring && !DefaultMetricsSystem.inMiniClusterMode()) { LOG.warn(this.prefix +" metrics system already initialized!"); return this; } this.prefix = checkNotNull(prefix, "prefix"); - ++refCount; if (monitoring) { // in mini cluster mode LOG.info(this.prefix +" metrics system started (again)"); 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 abd1b132b0a..879de2d0a19 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 @@ -26,6 +26,8 @@ import java.util.concurrent.atomic.*; import javax.annotation.Nullable; +import org.hamcrest.CoreMatchers; +import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -559,6 +561,50 @@ public class TestMetricsSystemImpl { ms.shutdown(); } + @Test + public void testInitShutdown() { + boolean oldMode = DefaultMetricsSystem.inMiniClusterMode(); + try { + DefaultMetricsSystem.setMiniClusterMode(true); + runInitShutdownTests(); + + DefaultMetricsSystem.setMiniClusterMode(false); + runInitShutdownTests(); + } finally { + DefaultMetricsSystem.setMiniClusterMode(oldMode); + } + } + + private void runInitShutdownTests() { + MetricsSystemImpl ms = new MetricsSystemImpl(); + Assert.assertThat(ms.isMonitoring(), CoreMatchers.is(false)); + Assert.assertThat(ms.getRefCount(), CoreMatchers.is(0)); + + ms.init("TestMetricsSystem1"); + Assert.assertThat(ms.isMonitoring(), CoreMatchers.is(true)); + Assert.assertThat(ms.getRefCount(), CoreMatchers.is(1)); + + ms.shutdown(); + Assert.assertThat(ms.isMonitoring(), CoreMatchers.is(false)); + Assert.assertThat(ms.getRefCount(), CoreMatchers.is(0)); + + ms.init("TestMetricsSystem2"); + Assert.assertThat(ms.isMonitoring(), CoreMatchers.is(true)); + Assert.assertThat(ms.getRefCount(), CoreMatchers.is(1)); + + ms.init("TestMetricsSystem3"); + Assert.assertThat(ms.isMonitoring(), CoreMatchers.is(true)); + Assert.assertThat(ms.getRefCount(), CoreMatchers.is(2)); + + ms.shutdown(); + Assert.assertThat(ms.isMonitoring(), CoreMatchers.is(true)); + Assert.assertThat(ms.getRefCount(), CoreMatchers.is(1)); + + ms.shutdown(); + Assert.assertThat(ms.isMonitoring(), CoreMatchers.is(false)); + Assert.assertThat(ms.getRefCount(), CoreMatchers.is(0)); + } + @Metrics(context="test") private static class TestSource { @Metric("C1 desc") MutableCounterLong c1;