Index: CHANGES.txt =================================================================== --- CHANGES.txt (revision 1190165) +++ CHANGES.txt (working copy) @@ -415,6 +415,7 @@ HBASE-4300 Start of new-version master fails if old master's znode is hanging around HBASE-4679 Thrift null mutation error + HBASE-4304 requestsPerSecond counter stuck at 0 (Li Pi) TESTS HBASE-4450 test for number of blocks read: to serve as baseline for expected Index: src/test/java/org/apache/hadoop/hbase/metrics/TestMetricsMBeanBase.java =================================================================== --- src/test/java/org/apache/hadoop/hbase/metrics/TestMetricsMBeanBase.java (revision 1190165) +++ src/test/java/org/apache/hadoop/hbase/metrics/TestMetricsMBeanBase.java (working copy) @@ -70,6 +70,7 @@ public void testGetAttribute() throws Exception { this.metricsRate.inc(2); + Thread.sleep(1000); this.metricsRate.pushMetric(this.metricsRecord); this.intValue.set(5); this.intValue.pushMetric(this.metricsRecord); @@ -78,7 +79,7 @@ this.varyRate.pushMetric(this.metricsRecord); - assertEquals( 2.0, (Float)this.stats.getAttribute("metricsRate"), 0.001 ); + assertEquals( 2.0, (Float)this.stats.getAttribute("metricsRate"), 0.005 ); assertEquals( 5, this.stats.getAttribute("intValue") ); assertEquals( 10L, this.stats.getAttribute("varyRateMinTime") ); assertEquals( 50L, this.stats.getAttribute("varyRateMaxTime") ); Index: src/main/java/org/apache/hadoop/hbase/metrics/MetricsRate.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/metrics/MetricsRate.java (revision 1190165) +++ src/main/java/org/apache/hadoop/hbase/metrics/MetricsRate.java (working copy) @@ -56,10 +56,14 @@ value++; } - private synchronized void intervalHeartBeat() { + public synchronized void intervalHeartBeat() { long now = System.currentTimeMillis(); - long diff = (now-ts)/1000; - if (diff == 0) diff = 1; // sigh this is crap. + long diff = (now-ts) / 1000; + if (diff < 1){ + // To make sure our averages aren't skewed by fast repeated calls, + // we simply ignore fast repeated calls. + return; + } this.prevRate = (float)value / diff; this.value = 0; this.ts = now; Index: src/main/java/org/apache/hadoop/hbase/regionserver/metrics/RegionServerMetrics.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/metrics/RegionServerMetrics.java (revision 1190165) +++ src/main/java/org/apache/hadoop/hbase/regionserver/metrics/RegionServerMetrics.java (working copy) @@ -116,7 +116,7 @@ /* * Count of requests to the regionservers since last call to metrics update */ - private final MetricsRate requests = new MetricsRate("requests", registry); + public final MetricsRate requests = new MetricsRate("requests", registry); /** * Count of stores open on the regionserver. Index: src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (revision 1190165) +++ src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (working copy) @@ -1018,7 +1018,6 @@ /** * @param encodedRegionName * @return An instance of RegionLoad. - * @throws IOException */ public HServerLoad.RegionLoad createRegionLoad(final String encodedRegionName) { HRegion r = null; @@ -1275,6 +1274,7 @@ protected void metrics() { this.metrics.regions.set(this.onlineRegions.size()); this.metrics.incrementRequests(this.requestCount.get()); + this.metrics.requests.intervalHeartBeat(); // Is this too expensive every three seconds getting a lock on onlineRegions // and then per store carried? Can I make metrics be sloppier and avoid // the synchronizations?