You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2012/08/17 21:02:14 UTC
svn commit: r1374397 -
/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/metrics/RegionServerDynamicMetrics.java
Author: stack
Date: Fri Aug 17 19:02:13 2012
New Revision: 1374397
URL: http://svn.apache.org/viewvc?rev=1374397&view=rev
Log:
HBASE-6602 Region Server Dynamic Metrics can cause high cpu usage.
Modified:
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/metrics/RegionServerDynamicMetrics.java
Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/metrics/RegionServerDynamicMetrics.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/metrics/RegionServerDynamicMetrics.java?rev=1374397&r1=1374396&r2=1374397&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/metrics/RegionServerDynamicMetrics.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/metrics/RegionServerDynamicMetrics.java Fri Aug 17 19:02:13 2012
@@ -64,6 +64,7 @@ public class RegionServerDynamicMetrics
LogFactory.getLog(RegionServerDynamicStatistics.class);
private boolean reflectionInitialized = false;
+ private boolean needsUpdateMessage = false;
private Field recordMetricMapField;
private Field registryMetricMapField;
@@ -102,14 +103,7 @@ public class RegionServerDynamicMetrics
MetricsLongValue m = (MetricsLongValue)registry.get(name);
if (m == null) {
m = new MetricsLongValue(name, this.registry);
- try {
- if (updateMbeanInfoIfMetricsListChanged != null) {
- updateMbeanInfoIfMetricsListChanged.invoke(this.rsDynamicStatistics,
- new Object[]{});
- }
- } catch (Exception e) {
- LOG.error(e);
- }
+ this.needsUpdateMessage = true;
}
m.set(amt);
}
@@ -121,14 +115,7 @@ public class RegionServerDynamicMetrics
MetricsTimeVaryingRate m = (MetricsTimeVaryingRate)registry.get(name);
if (m == null) {
m = new MetricsTimeVaryingRate(name, this.registry);
- try {
- if (updateMbeanInfoIfMetricsListChanged != null) {
- updateMbeanInfoIfMetricsListChanged.invoke(this.rsDynamicStatistics,
- new Object[]{});
- }
- } catch (Exception e) {
- LOG.error(e);
- }
+ this.needsUpdateMessage = true;
}
if (numOps > 0) {
m.inc(numOps, amt);
@@ -141,7 +128,7 @@ public class RegionServerDynamicMetrics
*/
@SuppressWarnings("rawtypes")
public void clear() {
-
+ this.needsUpdateMessage = true;
// If this is the first clear use reflection to get the two maps that hold copies of our
// metrics on the hadoop metrics side. We have to use reflection because there is not
// remove metrics on the hadoop side. If we can't get them then clearing old metrics
@@ -212,6 +199,21 @@ public class RegionServerDynamicMetrics
value.getSecond().getAndSet(0));
}
+ // If there are new metrics sending this message to jmx tells it to update everything.
+ // This is not ideal we should just move to metrics2 that has full support for dynamic metrics.
+ if (needsUpdateMessage) {
+ try {
+ if (updateMbeanInfoIfMetricsListChanged != null) {
+ updateMbeanInfoIfMetricsListChanged.invoke(this.rsDynamicStatistics,
+ new Object[]{});
+ }
+ } catch (Exception e) {
+ LOG.error(e);
+ }
+ needsUpdateMessage = false;
+ }
+
+
synchronized (registry) {
// Iterate through the registry to propagate the different rpc metrics.
for (String metricName : registry.getKeyList() ) {