diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 5e4caa0da94..b90573e7607 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -404,9 +404,6 @@ Release 2.7.0 - UNRELEASED HADOOP-11341. KMS support for whitelist key ACLs. (Arun Suresh via wang) - HADOOP-11301. [optionally] update jmx cache to drop old metrics - (Maysam Yabandeh via stack) - OPTIMIZATIONS HADOOP-11323. WritableComparator#compare keeps reference to byte array. 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 cae9c3d7b4d..cf11e6db14e 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 @@ -173,8 +173,9 @@ class MetricsSourceAdapter implements DynamicMBean { } synchronized(this) { - updateAttrCache(); - if (getAllMetrics) { + int oldCacheSize = attrCache.size(); + int newCacheSize = updateAttrCache(); + if (oldCacheSize < newCacheSize) { updateInfoCache(); } jmxCacheTS = Time.now(); diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/impl/TestMetricsSourceAdapter.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/impl/TestMetricsSourceAdapter.java index 22b594aecf7..724d449fccd 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/impl/TestMetricsSourceAdapter.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/impl/TestMetricsSourceAdapter.java @@ -23,8 +23,6 @@ import static org.junit.Assert.*; import java.util.ArrayList; import java.util.List; -import org.apache.hadoop.metrics2.MetricsCollector; -import org.apache.hadoop.metrics2.MetricsRecordBuilder; import org.apache.hadoop.metrics2.MetricsSource; import org.apache.hadoop.metrics2.MetricsTag; import org.apache.hadoop.metrics2.annotation.Metric; @@ -33,59 +31,10 @@ import org.apache.hadoop.metrics2.lib.MetricsAnnotations; import org.apache.hadoop.metrics2.lib.MetricsRegistry; import org.apache.hadoop.metrics2.lib.MetricsSourceBuilder; import org.apache.hadoop.metrics2.lib.MutableCounterLong; -import static org.apache.hadoop.metrics2.lib.Interns.info; -import static org.junit.Assert.assertEquals; - import org.junit.Test; -import javax.management.MBeanAttributeInfo; -import javax.management.MBeanInfo; - public class TestMetricsSourceAdapter { - - @Test - public void testPurgeOldMetrics() throws Exception { - // create test source with a single metric counter of value 1 - PurgableSource source = new PurgableSource(); - MetricsSourceBuilder sb = MetricsAnnotations.newSourceBuilder(source); - final MetricsSource s = sb.build(); - - List injectedTags = new ArrayList(); - MetricsSourceAdapter sa = new MetricsSourceAdapter( - "tst", "tst", "testdesc", s, injectedTags, null, null, 1, false); - - MBeanInfo info = sa.getMBeanInfo(); - boolean sawIt = false; - for (MBeanAttributeInfo mBeanAttributeInfo : info.getAttributes()) { - sawIt |= mBeanAttributeInfo.getName().equals(source.lastKeyName); - }; - assertTrue("The last generated metric is not exported to jmx", sawIt); - - Thread.sleep(1000); // skip JMX cache TTL - - info = sa.getMBeanInfo(); - sawIt = false; - for (MBeanAttributeInfo mBeanAttributeInfo : info.getAttributes()) { - sawIt |= mBeanAttributeInfo.getName().equals(source.lastKeyName); - }; - assertTrue("The last generated metric is not exported to jmx", sawIt); - } - - //generate a new key per each call - class PurgableSource implements MetricsSource { - int nextKey = 0; - String lastKeyName = null; - @Override - public void getMetrics(MetricsCollector collector, boolean all) { - MetricsRecordBuilder rb = - collector.addRecord("purgablesource") - .setContext("test"); - lastKeyName = "key" + nextKey++; - rb.addGauge(info(lastKeyName, "desc"), 1); - } - } - @Test public void testGetMetricsAndJmx() throws Exception { // create test source with a single metric counter of value 0