From 4356e8a5ef0ac6d11a34704b80ef360a710e623a Mon Sep 17 00:00:00 2001 From: Tsuyoshi Ozawa Date: Thu, 14 May 2015 10:20:45 +0900 Subject: [PATCH] HADOOP-11361. Fix a race condition in MetricsSourceAdapter.updateJmxCache. Contributed by Brahma Reddy Battula. --- hadoop-common-project/hadoop-common/CHANGES.txt | 3 +++ .../metrics2/impl/MetricsSourceAdapter.java | 17 +++++++---------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 207d1445f2c..5e6b9ea4c0d 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -674,6 +674,9 @@ Release 2.8.0 - UNRELEASED HADOOP-11962. Sasl message with MD5 challenge text shouldn't be LOG out even in debug level. (Junping Du via wheat9) + HADOOP-11361. Fix a race condition in MetricsSourceAdapter.updateJmxCache. + (Brahma Reddy Battula via ozawa) + Release 2.7.1 - UNRELEASED INCOMPATIBLE CHANGES 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..f3ddc916a39 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 @@ -154,31 +154,28 @@ class MetricsSourceAdapter implements DynamicMBean { private void updateJmxCache() { boolean getAllMetrics = false; - synchronized(this) { + synchronized (this) { if (Time.now() - jmxCacheTS >= jmxCacheTTL) { // temporarilly advance the expiry while updating the cache jmxCacheTS = Time.now() + jmxCacheTTL; if (lastRecs == null) { getAllMetrics = true; } - } - else { + } else { return; } - } - if (getAllMetrics) { - MetricsCollectorImpl builder = new MetricsCollectorImpl(); - getMetrics(builder, true); - } + if (getAllMetrics) { + MetricsCollectorImpl builder = new MetricsCollectorImpl(); + getMetrics(builder, true); + } - synchronized(this) { updateAttrCache(); if (getAllMetrics) { updateInfoCache(); } jmxCacheTS = Time.now(); - lastRecs = null; // in case regular interval update is not running + lastRecs = null; // in case regular interval update is not running } }