diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index b90573e7607..5e4caa0da94 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -404,6 +404,9 @@ 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 cf11e6db14e..cae9c3d7b4d 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,9 +173,8 @@ private void updateJmxCache() { } synchronized(this) { - int oldCacheSize = attrCache.size(); - int newCacheSize = updateAttrCache(); - if (oldCacheSize < newCacheSize) { + updateAttrCache(); + if (getAllMetrics) { 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 724d449fccd..22b594aecf7 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,6 +23,8 @@ 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; @@ -31,10 +33,59 @@ 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