Author: mattf
Date: Sun Feb 19 22:39:50 2012
New Revision: 1291081
URL: http://svn.apache.org/viewvc?rev=1291081&view=rev
Log:
HADOOP-8050. Deadlock in metrics. Contributed by Kihwal Lee.
Modified:
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/CHANGES.txt
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSourceAdapter.java
Modified:
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/CHANGES.txt
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/CHANGES.txt?rev=1291081&r1=1291080&r2=1291081&view=diff
==============================================================================
---
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/CHANGES.txt
(original)
+++
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/CHANGES.txt
Sun Feb 19 22:39:50 2012
@@ -60,6 +60,8 @@ Release 0.23.2 - UNRELEASED
HADOOP-7680 TestHardLink fails on Mac OS X, when gnu stat is in path.
(Milind Bhandarkar via stevel)
+ HADOOP-8050. Deadlock in metrics. (Kihwal Lee via mattf)
+
Release 0.23.1 - 2012-02-17
INCOMPATIBLE CHANGES
Modified:
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSourceAdapter.java
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSourceAdapter.java?rev=1291081&r1=1291080&r2=1291081&view=diff
==============================================================================
---
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSourceAdapter.java
(original)
+++
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSourceAdapter.java
Sun Feb 19 22:39:50 2012
@@ -94,17 +94,19 @@ class MetricsSourceAdapter implements Dy
}
@Override
- public synchronized Object getAttribute(String attribute)
+ public Object getAttribute(String attribute)
throws AttributeNotFoundException, MBeanException, ReflectionException {
updateJmxCache();
- Attribute a = attrCache.get(attribute);
- if (a == null) {
- throw new AttributeNotFoundException(attribute +" not found");
- }
- if (LOG.isDebugEnabled()) {
- LOG.debug(attribute +": "+ a);
+ synchronized(this) {
+ Attribute a = attrCache.get(attribute);
+ if (a == null) {
+ throw new AttributeNotFoundException(attribute +" not found");
+ }
+ if (LOG.isDebugEnabled()) {
+ LOG.debug(attribute +": "+ a);
+ }
+ return a.getValue();
}
- return a.getValue();
}
@Override
@@ -115,17 +117,19 @@ class MetricsSourceAdapter implements Dy
}
@Override
- public synchronized AttributeList getAttributes(String[] attributes) {
+ public AttributeList getAttributes(String[] attributes) {
updateJmxCache();
- AttributeList ret = new AttributeList();
- for (String key : attributes) {
- Attribute attr = attrCache.get(key);
- if (LOG.isDebugEnabled()) {
- LOG.debug(key +": "+ attr);
+ synchronized(this) {
+ AttributeList ret = new AttributeList();
+ for (String key : attributes) {
+ Attribute attr = attrCache.get(key);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug(key +": "+ attr);
+ }
+ ret.add(attr);
}
- ret.add(attr);
+ return ret;
}
- return ret;
}
@Override
@@ -140,17 +144,32 @@ class MetricsSourceAdapter implements Dy
}
@Override
- public synchronized MBeanInfo getMBeanInfo() {
+ public MBeanInfo getMBeanInfo() {
updateJmxCache();
return infoCache;
}
- private synchronized void updateJmxCache() {
- if (System.currentTimeMillis() - jmxCacheTS >= jmxCacheTTL) {
- if (lastRecs == null) {
- MetricsCollectorImpl builder = new MetricsCollectorImpl();
- getMetrics(builder, true);
+ private void updateJmxCache() {
+ boolean getAllMetrics = false;
+ synchronized(this) {
+ if (System.currentTimeMillis() - jmxCacheTS >= jmxCacheTTL) {
+ // temporarilly advance the expiry while updating the cache
+ jmxCacheTS = System.currentTimeMillis() + jmxCacheTTL;
+ if (lastRecs == null) {
+ getAllMetrics = true;
+ }
+ }
+ else {
+ return;
}
+ }
+
+ if (getAllMetrics) {
+ MetricsCollectorImpl builder = new MetricsCollectorImpl();
+ getMetrics(builder, true);
+ }
+
+ synchronized(this) {
int oldCacheSize = attrCache.size();
int newCacheSize = updateAttrCache();
if (oldCacheSize < newCacheSize) {