You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ec...@apache.org on 2013/04/12 23:47:26 UTC

svn commit: r1467486 - in /hbase/branches/0.95: hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/ hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/ hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/...

Author: eclark
Date: Fri Apr 12 21:47:26 2013
New Revision: 1467486

URL: http://svn.apache.org/r1467486
Log:
HBASE-7255 KV size metric went missing from StoreScanner.

Modified:
    hbase/branches/0.95/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java
    hbase/branches/0.95/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSource.java
    hbase/branches/0.95/hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java
    hbase/branches/0.95/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java
    hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
    hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/InternalScanner.java
    hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/KeyValueHeap.java
    hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegion.java
    hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionScanner.java
    hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java
    hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorInterface.java
    hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.java
    hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java

Modified: hbase/branches/0.95/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java?rev=1467486&r1=1467485&r2=1467486&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java (original)
+++ hbase/branches/0.95/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java Fri Apr 12 21:47:26 2013
@@ -188,6 +188,7 @@ public interface MetricsRegionServerSour
   static final String INCREMENT_KEY = "increment";
   static final String MUTATE_KEY = "mutate";
   static final String APPEND_KEY = "append";
+  static final String SCAN_NEXT_KEY = "scanNext";
   static final String SLOW_MUTATE_KEY = "slowPutCount";
   static final String SLOW_GET_KEY = "slowGetCount";
   static final String SLOW_DELETE_KEY = "slowDeleteCount";

Modified: hbase/branches/0.95/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSource.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSource.java?rev=1467486&r1=1467485&r2=1467486&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSource.java (original)
+++ hbase/branches/0.95/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSource.java Fri Apr 12 21:47:26 2013
@@ -25,6 +25,9 @@ package org.apache.hadoop.hbase.regionse
  */
 public interface MetricsRegionSource extends Comparable<MetricsRegionSource> {
 
+  public static final String OPS_SAMPLE_NAME = "ops";
+  public static final String SIZE_VALUE_NAME = "size";
+
   /**
    * Close the region's metrics as this region is closing.
    */
@@ -41,11 +44,17 @@ public interface MetricsRegionSource ext
   void updateDelete();
 
   /**
-   * Update related counts of gets.
+   * Update count and sizes of gets.
+   * @param getSize size in bytes of the resulting key values for a get
    */
-  void updateGet();
+  void updateGet(long getSize);
 
   /**
+   * Update the count and sizes of resultScanner.next()
+   * @param scanSize Size in bytes of the resulting key values for a next()
+   */
+  void updateScan(long scanSize);
+  /**
    * Update related counts of increments.
    */
   void updateIncrement();
@@ -59,4 +68,6 @@ public interface MetricsRegionSource ext
    * Get the aggregate source to which this reports.
    */
   MetricsRegionAggregateSource getAggregateSource();
+
+
 }

Modified: hbase/branches/0.95/hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java?rev=1467486&r1=1467485&r2=1467486&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java (original)
+++ hbase/branches/0.95/hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java Fri Apr 12 21:47:26 2013
@@ -24,6 +24,7 @@ import org.apache.hadoop.metrics2.Metric
 import org.apache.hadoop.metrics2.impl.JmxCacheBuster;
 import org.apache.hadoop.metrics2.lib.DynamicMetricsRegistry;
 import org.apache.hadoop.metrics2.lib.MetricMutableCounterLong;
+import org.apache.hadoop.metrics2.lib.MetricMutableStat;
 
 public class MetricsRegionSourceImpl implements MetricsRegionSource {
 
@@ -39,12 +40,15 @@ public class MetricsRegionSourceImpl imp
   private String regionGetKey;
   private String regionIncrementKey;
   private String regionAppendKey;
+  private String regionScanNextKey;
   private MetricMutableCounterLong regionPut;
   private MetricMutableCounterLong regionDelete;
-  private MetricMutableCounterLong regionGet;
   private MetricMutableCounterLong regionIncrement;
   private MetricMutableCounterLong regionAppend;
 
+  private MetricMutableStat regionGet;
+  private MetricMutableStat regionScanNext;
+
   public MetricsRegionSourceImpl(MetricsRegionWrapper regionWrapper,
                                  MetricsRegionAggregateSourceImpl aggregate) {
     this.regionWrapper = regionWrapper;
@@ -70,14 +74,17 @@ public class MetricsRegionSourceImpl imp
     regionDeleteKey = regionNamePrefix + MetricsRegionServerSource.DELETE_KEY + suffix;
     regionDelete = registry.getLongCounter(regionDeleteKey, 0l);
 
-    regionGetKey = regionNamePrefix + MetricsRegionServerSource.GET_KEY + suffix;
-    regionGet = registry.getLongCounter(regionGetKey, 0l);
-
     regionIncrementKey = regionNamePrefix + MetricsRegionServerSource.INCREMENT_KEY + suffix;
     regionIncrement = registry.getLongCounter(regionIncrementKey, 0l);
 
     regionAppendKey = regionNamePrefix + MetricsRegionServerSource.APPEND_KEY + suffix;
     regionAppend = registry.getLongCounter(regionAppendKey, 0l);
+
+    regionGetKey = regionNamePrefix + MetricsRegionServerSource.GET_KEY;
+    regionGet = registry.newStat(regionGetKey, "", OPS_SAMPLE_NAME, SIZE_VALUE_NAME);
+
+    regionScanNextKey = regionNamePrefix + MetricsRegionServerSource.SCAN_NEXT_KEY;
+    regionScanNext = registry.newStat(regionScanNextKey, "", OPS_SAMPLE_NAME, SIZE_VALUE_NAME);
   }
 
   @Override
@@ -88,11 +95,13 @@ public class MetricsRegionSourceImpl imp
     LOG.trace("Removing region Metrics: " + regionWrapper.getRegionName());
     registry.removeMetric(regionPutKey);
     registry.removeMetric(regionDeleteKey);
-    registry.removeMetric(regionGetKey);
     registry.removeMetric(regionIncrementKey);
 
     registry.removeMetric(regionAppendKey);
 
+    registry.removeMetric(regionGetKey);
+    registry.removeMetric(regionScanNextKey);
+
     JmxCacheBuster.clearJmxCache();
   }
 
@@ -107,8 +116,13 @@ public class MetricsRegionSourceImpl imp
   }
 
   @Override
-  public void updateGet() {
-    regionGet.incr();
+  public void updateGet(long getSize) {
+    regionGet.add(getSize);
+  }
+
+  @Override
+  public void updateScan(long scanSize) {
+    regionScanNext.add(scanSize);
   }
 
   @Override

Modified: hbase/branches/0.95/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java?rev=1467486&r1=1467485&r2=1467486&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java (original)
+++ hbase/branches/0.95/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java Fri Apr 12 21:47:26 2013
@@ -20,16 +20,18 @@ package org.apache.hadoop.hbase.regionse
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.hadoop.hbase.regionserver.MetricsRegionSourceImpl;
 import org.apache.hadoop.metrics2.MetricsRecordBuilder;
 import org.apache.hadoop.metrics2.impl.JmxCacheBuster;
 import org.apache.hadoop.metrics2.lib.DynamicMetricsRegistry;
 import org.apache.hadoop.metrics2.lib.Interns;
 import org.apache.hadoop.metrics2.lib.MutableCounterLong;
+import org.apache.hadoop.metrics2.lib.MutableStat;
 
 public class MetricsRegionSourceImpl implements MetricsRegionSource {
 
   private final MetricsRegionWrapper regionWrapper;
+
+
   private boolean closed = false;
   private MetricsRegionAggregateSourceImpl agg;
   private DynamicMetricsRegistry registry;
@@ -41,12 +43,15 @@ public class MetricsRegionSourceImpl imp
   private String regionGetKey;
   private String regionIncrementKey;
   private String regionAppendKey;
+  private String regionScanNextKey;
   private MutableCounterLong regionPut;
   private MutableCounterLong regionDelete;
-  private MutableCounterLong regionGet;
+
   private MutableCounterLong regionIncrement;
   private MutableCounterLong regionAppend;
 
+  private MutableStat regionGet;
+  private MutableStat regionScanNext;
 
   public MetricsRegionSourceImpl(MetricsRegionWrapper regionWrapper,
                                  MetricsRegionAggregateSourceImpl aggregate) {
@@ -72,14 +77,17 @@ public class MetricsRegionSourceImpl imp
     regionDeleteKey = regionNamePrefix + MetricsRegionServerSource.DELETE_KEY + suffix;
     regionDelete = registry.getLongCounter(regionDeleteKey, 0l);
 
-    regionGetKey = regionNamePrefix + MetricsRegionServerSource.GET_KEY + suffix;
-    regionGet = registry.getLongCounter(regionGetKey, 0l);
-
     regionIncrementKey = regionNamePrefix + MetricsRegionServerSource.INCREMENT_KEY + suffix;
     regionIncrement = registry.getLongCounter(regionIncrementKey, 0l);
 
     regionAppendKey = regionNamePrefix + MetricsRegionServerSource.APPEND_KEY + suffix;
     regionAppend = registry.getLongCounter(regionAppendKey, 0l);
+
+    regionGetKey = regionNamePrefix + MetricsRegionServerSource.GET_KEY;
+    regionGet = registry.newStat(regionGetKey, "", OPS_SAMPLE_NAME, SIZE_VALUE_NAME);
+
+    regionScanNextKey = regionNamePrefix + MetricsRegionServerSource.SCAN_NEXT_KEY;
+    regionScanNext = registry.newStat(regionScanNextKey, "", OPS_SAMPLE_NAME, SIZE_VALUE_NAME);
   }
 
   @Override
@@ -90,11 +98,14 @@ public class MetricsRegionSourceImpl imp
     LOG.trace("Removing region Metrics: " + regionWrapper.getRegionName());
     registry.removeMetric(regionPutKey);
     registry.removeMetric(regionDeleteKey);
-    registry.removeMetric(regionGetKey);
+
     registry.removeMetric(regionIncrementKey);
 
     registry.removeMetric(regionAppendKey);
 
+    registry.removeMetric(regionGetKey);
+    registry.removeMetric(regionScanNextKey);
+
     JmxCacheBuster.clearJmxCache();
   }
 
@@ -109,8 +120,13 @@ public class MetricsRegionSourceImpl imp
   }
 
   @Override
-  public void updateGet() {
-    regionGet.incr();
+  public void updateGet(long getSize) {
+    regionGet.add(getSize);
+  }
+
+  @Override
+  public void updateScan(long scanSize) {
+    regionScanNext.add(scanSize);
   }
 
   @Override

Modified: hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=1467486&r1=1467485&r2=1467486&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original)
+++ hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java Fri Apr 12 21:47:26 2013
@@ -3456,14 +3456,14 @@ public class HRegion implements HeapSize
     }
 
     @Override
-    public boolean next(List<KeyValue> outResults, int limit)
+    public boolean next(List<KeyValue> outResults)
         throws IOException {
-      return next(outResults, limit, null);
+      // apply the batching limit by default
+      return next(outResults, batch);
     }
 
     @Override
-    public synchronized boolean next(List<KeyValue> outResults, int limit,
-        String metric) throws IOException {
+    public synchronized boolean next(List<KeyValue> outResults, int limit) throws IOException {
       if (this.filterClosed) {
         throw new UnknownScannerException("Scanner was closed (timed out?) " +
             "after we renewed it. Could be caused by a very slow scanner " +
@@ -3476,7 +3476,7 @@ public class HRegion implements HeapSize
         // This could be a new thread from the last time we called next().
         MultiVersionConsistencyControl.setThreadReadPoint(this.readPt);
 
-        return nextRaw(outResults, limit, metric);
+        return nextRaw(outResults, limit);
       } finally {
         closeRegionOperation();
       }
@@ -3485,49 +3485,44 @@ public class HRegion implements HeapSize
     @Override
     public boolean nextRaw(List<KeyValue> outResults)
         throws IOException {
-      return nextRaw(outResults, batch, null);
+      return nextRaw(outResults, batch);
     }
 
     @Override
-    public boolean nextRaw(List<KeyValue> outResults, int limit,
-        String metric) throws IOException {
+    public boolean nextRaw(List<KeyValue> outResults, int limit) throws IOException {
       boolean returnResult;
       if (outResults.isEmpty()) {
         // Usually outResults is empty. This is true when next is called
         // to handle scan or get operation.
-        returnResult = nextInternal(outResults, limit, metric);
+        returnResult = nextInternal(outResults, limit);
       } else {
         List<KeyValue> tmpList = new ArrayList<KeyValue>();
-        returnResult = nextInternal(tmpList, limit, metric);
+        returnResult = nextInternal(tmpList, limit);
         outResults.addAll(tmpList);
       }
       resetFilters();
       if (isFilterDone()) {
         return false;
       }
+      if (region != null && region.metricsRegion != null) {
+        long totalSize = 0;
+        if (outResults != null) {
+          for(KeyValue kv:outResults) {
+            totalSize += kv.getLength();
+          }
+        }
+        region.metricsRegion.updateScanNext(totalSize);
+      }
       return returnResult;
     }
 
-    @Override
-    public boolean next(List<KeyValue> outResults)
-        throws IOException {
-      // apply the batching limit by default
-      return next(outResults, batch, null);
-    }
-
-    @Override
-    public boolean next(List<KeyValue> outResults, String metric)
-        throws IOException {
-      // apply the batching limit by default
-      return next(outResults, batch, metric);
-    }
 
-    private void populateFromJoinedHeap(List<KeyValue> results, int limit, String metric)
+    private void populateFromJoinedHeap(List<KeyValue> results, int limit)
         throws IOException {
       assert joinedContinuationRow != null;
       KeyValue kv = populateResult(results, this.joinedHeap, limit,
           joinedContinuationRow.getBuffer(), joinedContinuationRow.getRowOffset(),
-          joinedContinuationRow.getRowLength(), metric);
+          joinedContinuationRow.getRowLength());
       if (kv != KV_LIMIT) {
         // We are done with this row, reset the continuation.
         joinedContinuationRow = null;
@@ -3545,14 +3540,13 @@ public class HRegion implements HeapSize
      * @param currentRow Byte array with key we are fetching.
      * @param offset offset for currentRow
      * @param length length for currentRow
-     * @param metric Metric key to be passed into KeyValueHeap::next().
      * @return KV_LIMIT if limit reached, next KeyValue otherwise.
      */
     private KeyValue populateResult(List<KeyValue> results, KeyValueHeap heap, int limit,
-        byte[] currentRow, int offset, short length, String metric) throws IOException {
+        byte[] currentRow, int offset, short length) throws IOException {
       KeyValue nextKv;
       do {
-        heap.next(results, limit - results.size(), metric);
+        heap.next(results, limit - results.size());
         if (limit > 0 && results.size() == limit) {
           return KV_LIMIT;
         }
@@ -3569,7 +3563,7 @@ public class HRegion implements HeapSize
       return this.filter != null && this.filter.filterAllRemaining();
     }
 
-    private boolean nextInternal(List<KeyValue> results, int limit, String metric)
+    private boolean nextInternal(List<KeyValue> results, int limit)
     throws IOException {
       if (!results.isEmpty()) {
         throw new IllegalArgumentException("First parameter should be an empty list");
@@ -3622,7 +3616,7 @@ public class HRegion implements HeapSize
           }
 
           KeyValue nextKv = populateResult(results, this.storeHeap, limit, currentRow, offset,
-              length, metric);
+              length);
           // Ok, we are good, let's try to get some results from the main heap.
           if (nextKv == KV_LIMIT) {
             if (this.filter != null && filter.hasFilterRow()) {
@@ -3667,12 +3661,12 @@ public class HRegion implements HeapSize
                 && joinedHeap.peek().matchingRow(currentRow, offset, length));
             if (mayHaveData) {
               joinedContinuationRow = current;
-              populateFromJoinedHeap(results, limit, metric);
+              populateFromJoinedHeap(results, limit);
             }
           }
         } else {
           // Populating from the joined heap was stopped by limits, populate some more.
-          populateFromJoinedHeap(results, limit, metric);
+          populateFromJoinedHeap(results, limit);
         }
 
         // We may have just called populateFromJoinedMap and hit the limits. If that is
@@ -4382,7 +4376,13 @@ public class HRegion implements HeapSize
 
     // do after lock
     if (this.metricsRegion != null) {
-      this.metricsRegion.updateGet();
+      long totalSize = 0l;
+      if (results != null) {
+        for (KeyValue kv:results) {
+          totalSize += kv.getLength();
+        }
+      }
+      this.metricsRegion.updateGet(totalSize);
     }
 
     return results;

Modified: hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/InternalScanner.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/InternalScanner.java?rev=1467486&r1=1467485&r2=1467486&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/InternalScanner.java (original)
+++ hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/InternalScanner.java Fri Apr 12 21:47:26 2013
@@ -48,15 +48,6 @@ public interface InternalScanner extends
    * @throws IOException e
    */
   public boolean next(List<KeyValue> results) throws IOException;
-  
-  /**
-   * Grab the next row's worth of values.
-   * @param results return output array
-   * @param metric the metric name
-   * @return true if more rows exist after this one, false if scanner is done
-   * @throws IOException e
-   */
-  public boolean next(List<KeyValue> results, String metric) throws IOException;
 
   /**
    * Grab the next row's worth of values with a limit on the number of values
@@ -67,17 +58,6 @@ public interface InternalScanner extends
    * @throws IOException e
    */
   public boolean next(List<KeyValue> result, int limit) throws IOException;
-  
-  /**
-   * Grab the next row's worth of values with a limit on the number of values
-   * to return.
-   * @param result return output array
-   * @param limit limit on row count to get
-   * @param metric the metric name
-   * @return true if more rows exist after this one, false if scanner is done
-   * @throws IOException e
-   */
-  public boolean next(List<KeyValue> result, int limit, String metric) throws IOException;
 
   /**
    * Closes the scanner and releases any resources it has allocated

Modified: hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/KeyValueHeap.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/KeyValueHeap.java?rev=1467486&r1=1467485&r2=1467486&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/KeyValueHeap.java (original)
+++ hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/KeyValueHeap.java Fri Apr 12 21:47:26 2013
@@ -121,27 +121,11 @@ public class KeyValueHeap extends NonLaz
    * @return true if there are more keys, false if all scanners are done
    */
   public boolean next(List<KeyValue> result, int limit) throws IOException {
-    return next(result, limit, null);
-  }
-
-  /**
-   * Gets the next row of keys from the top-most scanner.
-   * <p>
-   * This method takes care of updating the heap.
-   * <p>
-   * This can ONLY be called when you are using Scanners that implement
-   * InternalScanner as well as KeyValueScanner (a {@link StoreScanner}).
-   * @param result output result list
-   * @param limit limit on row count to get
-   * @param metric the metric name
-   * @return true if there are more keys, false if all scanners are done
-   */
-  public boolean next(List<KeyValue> result, int limit, String metric) throws IOException {
     if (this.current == null) {
       return false;
     }
     InternalScanner currentAsInternal = (InternalScanner)this.current;
-    boolean mayContainMoreRows = currentAsInternal.next(result, limit, metric);
+    boolean mayContainMoreRows = currentAsInternal.next(result, limit);
     KeyValue pee = this.current.peek();
     /*
      * By definition, any InternalScanner must return false only when it has no
@@ -173,11 +157,6 @@ public class KeyValueHeap extends NonLaz
     return next(result, -1);
   }
 
-  @Override
-  public boolean next(List<KeyValue> result, String metric) throws IOException {
-    return next(result, -1, metric);
-  }
-
   private static class KVScannerComparator implements Comparator<KeyValueScanner> {
     private KVComparator kvComparator;
     /**

Modified: hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegion.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegion.java?rev=1467486&r1=1467485&r2=1467486&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegion.java (original)
+++ hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegion.java Fri Apr 12 21:47:26 2013
@@ -48,8 +48,12 @@ public class MetricsRegion {
     source.updateDelete();
   }
 
-  public void updateGet() {
-    source.updateGet();
+  public void updateGet(long getSize) {
+    source.updateGet(getSize);
+  }
+
+  public void updateScanNext(long scanSize) {
+    source.updateScan(scanSize);
   }
 
   public void updateAppend() {

Modified: hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionScanner.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionScanner.java?rev=1467486&r1=1467485&r2=1467486&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionScanner.java (original)
+++ hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionScanner.java Fri Apr 12 21:47:26 2013
@@ -69,7 +69,7 @@ public interface RegionScanner extends I
    * to return.
    * This is a special internal method to be called from coprocessor hooks to avoid expensive setup.
    * Caller must set the thread's readpoint, start and close a region operation, an synchronize on the scanner object.
-   * See {@link #nextRaw(List, int, String)}
+   * See {@link #nextRaw(List, int)}
    * @param result return output array
    * @return true if more rows exist after this one, false if scanner is done
    * @throws IOException e
@@ -99,9 +99,8 @@ public interface RegionScanner extends I
    * </pre></code>
    * @param result return output array
    * @param limit limit on row count to get
-   * @param metric the metric name
    * @return true if more rows exist after this one, false if scanner is done
    * @throws IOException e
    */
-  public boolean nextRaw(List<KeyValue> result, int limit, String metric) throws IOException;
+  public boolean nextRaw(List<KeyValue> result, int limit) throws IOException;
 }

Modified: hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java?rev=1467486&r1=1467485&r2=1467486&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java (original)
+++ hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java Fri Apr 12 21:47:26 2013
@@ -353,19 +353,6 @@ public class StoreScanner extends NonLaz
    */
   @Override
   public synchronized boolean next(List<KeyValue> outResult, int limit) throws IOException {
-    return next(outResult, limit, null);
-  }
-
-  /**
-   * Get the next row of values from this Store.
-   * @param outResult
-   * @param limit
-   * @return true if there are more rows, false if scanner is done
-   */
-  @Override
-  public synchronized boolean next(List<KeyValue> outResult, int limit,
-      String metric) throws IOException {
-
     if (checkReseek()) {
       return true;
     }
@@ -401,104 +388,94 @@ public class StoreScanner extends NonLaz
     KeyValue.KVComparator comparator =
         store != null ? store.getComparator() : null;
 
-    long cumulativeMetric = 0;
     int count = 0;
-    try {
-      LOOP: while((kv = this.heap.peek()) != null) {
-        // Check that the heap gives us KVs in an increasing order.
-        assert prevKV == null || comparator == null || comparator.compare(prevKV, kv) <= 0 :
-          "Key " + prevKV + " followed by a " + "smaller key " + kv + " in cf " + store;
-        prevKV = kv;
-
-        ScanQueryMatcher.MatchCode qcode = matcher.match(kv);
-        switch(qcode) {
-          case INCLUDE:
-          case INCLUDE_AND_SEEK_NEXT_ROW:
-          case INCLUDE_AND_SEEK_NEXT_COL:
-
-            Filter f = matcher.getFilter();
-            if (f != null) {
-              kv = f.transform(kv);
-            }
-
-            this.countPerRow++;
-            if (storeLimit > -1 &&
-                this.countPerRow > (storeLimit + storeOffset)) {
-              // do what SEEK_NEXT_ROW does.
-              if (!matcher.moreRowsMayExistAfter(kv)) {
-                return false;
-              }
-              reseek(matcher.getKeyForNextRow(kv));
-              break LOOP;
-            }
-
-            // add to results only if we have skipped #storeOffset kvs
-            // also update metric accordingly
-            if (this.countPerRow > storeOffset) {
-              if (metric != null) {
-                cumulativeMetric += kv.getLength();
-              }
-              outResult.add(kv);
-              count++;
-            }
-
-            if (qcode == ScanQueryMatcher.MatchCode.INCLUDE_AND_SEEK_NEXT_ROW) {
-              if (!matcher.moreRowsMayExistAfter(kv)) {
-                return false;
-              }
-              reseek(matcher.getKeyForNextRow(kv));
-            } else if (qcode == ScanQueryMatcher.MatchCode.INCLUDE_AND_SEEK_NEXT_COL) {
-              reseek(matcher.getKeyForNextColumn(kv));
-            } else {
-              this.heap.next();
-            }
-
-            if (limit > 0 && (count == limit)) {
-              break LOOP;
+    LOOP: while((kv = this.heap.peek()) != null) {
+      // Check that the heap gives us KVs in an increasing order.
+      assert prevKV == null || comparator == null || comparator.compare(prevKV, kv) <= 0 :
+        "Key " + prevKV + " followed by a " + "smaller key " + kv + " in cf " + store;
+      prevKV = kv;
+
+      ScanQueryMatcher.MatchCode qcode = matcher.match(kv);
+      switch(qcode) {
+        case INCLUDE:
+        case INCLUDE_AND_SEEK_NEXT_ROW:
+        case INCLUDE_AND_SEEK_NEXT_COL:
+
+          Filter f = matcher.getFilter();
+          if (f != null) {
+            kv = f.transform(kv);
+          }
+
+          this.countPerRow++;
+          if (storeLimit > -1 &&
+              this.countPerRow > (storeLimit + storeOffset)) {
+            // do what SEEK_NEXT_ROW does.
+            if (!matcher.moreRowsMayExistAfter(kv)) {
+              return false;
             }
-            continue;
-
-          case DONE:
-            return true;
+            reseek(matcher.getKeyForNextRow(kv));
+            break LOOP;
+          }
 
-          case DONE_SCAN:
-            close();
-            return false;
+          // add to results only if we have skipped #storeOffset kvs
+          // also update metric accordingly
+          if (this.countPerRow > storeOffset) {
+            outResult.add(kv);
+            count++;
+          }
 
-          case SEEK_NEXT_ROW:
-            // This is just a relatively simple end of scan fix, to short-cut end
-            // us if there is an endKey in the scan.
+          if (qcode == ScanQueryMatcher.MatchCode.INCLUDE_AND_SEEK_NEXT_ROW) {
             if (!matcher.moreRowsMayExistAfter(kv)) {
               return false;
             }
-
             reseek(matcher.getKeyForNextRow(kv));
-            break;
-
-          case SEEK_NEXT_COL:
+          } else if (qcode == ScanQueryMatcher.MatchCode.INCLUDE_AND_SEEK_NEXT_COL) {
             reseek(matcher.getKeyForNextColumn(kv));
-            break;
-
-          case SKIP:
+          } else {
             this.heap.next();
-            break;
+          }
 
-          case SEEK_NEXT_USING_HINT:
-            KeyValue nextKV = matcher.getNextKeyHint(kv);
-            if (nextKV != null) {
-              reseek(nextKV);
-            } else {
-              heap.next();
-            }
-            break;
+          if (limit > 0 && (count == limit)) {
+            break LOOP;
+          }
+          continue;
+
+        case DONE:
+          return true;
+
+        case DONE_SCAN:
+          close();
+          return false;
+
+        case SEEK_NEXT_ROW:
+          // This is just a relatively simple end of scan fix, to short-cut end
+          // us if there is an endKey in the scan.
+          if (!matcher.moreRowsMayExistAfter(kv)) {
+            return false;
+          }
 
-          default:
-            throw new RuntimeException("UNEXPECTED");
-        }
-      }
-    } finally {
-      if (cumulativeMetric > 0 && metric != null) {
+          reseek(matcher.getKeyForNextRow(kv));
+          break;
+
+        case SEEK_NEXT_COL:
+          reseek(matcher.getKeyForNextColumn(kv));
+          break;
+
+        case SKIP:
+          this.heap.next();
+          break;
+
+        case SEEK_NEXT_USING_HINT:
+          KeyValue nextKV = matcher.getNextKeyHint(kv);
+          if (nextKV != null) {
+            reseek(nextKV);
+          } else {
+            heap.next();
+          }
+          break;
 
+        default:
+          throw new RuntimeException("UNEXPECTED");
       }
     }
 
@@ -513,13 +490,7 @@ public class StoreScanner extends NonLaz
 
   @Override
   public synchronized boolean next(List<KeyValue> outResult) throws IOException {
-    return next(outResult, -1, null);
-  }
-
-  @Override
-  public synchronized boolean next(List<KeyValue> outResult, String metric)
-      throws IOException {
-    return next(outResult, -1, metric);
+    return next(outResult, -1);
   }
 
   // Implementation of ChangedReadersObserver

Modified: hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorInterface.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorInterface.java?rev=1467486&r1=1467485&r2=1467486&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorInterface.java (original)
+++ hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorInterface.java Fri Apr 12 21:47:26 2013
@@ -78,32 +78,20 @@ public class TestCoprocessorInterface ex
     }
 
     @Override
-    public boolean next(List<KeyValue> results, String metric)
-        throws IOException {
-      return delegate.next(results, metric);
-    }
-
-    @Override
     public boolean next(List<KeyValue> result, int limit) throws IOException {
       return delegate.next(result, limit);
     }
 
     @Override
-    public boolean next(List<KeyValue> result, int limit, String metric)
-        throws IOException {
-      return delegate.next(result, limit, metric);
-    }
-
-    @Override
-    public boolean nextRaw(List<KeyValue> result, int limit, String metric) 
+    public boolean nextRaw(List<KeyValue> result) 
         throws IOException {
-      return delegate.nextRaw(result, limit, metric);
+      return delegate.nextRaw(result);
     }
 
     @Override
-    public boolean nextRaw(List<KeyValue> result) 
+    public boolean nextRaw(List<KeyValue> result, int limit)
         throws IOException {
-      return delegate.nextRaw(result);
+      return delegate.nextRaw(result, limit);
     }
 
     @Override

Modified: hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.java?rev=1467486&r1=1467485&r2=1467486&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.java (original)
+++ hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.java Fri Apr 12 21:47:26 2013
@@ -325,24 +325,12 @@ public class TestRegionObserverInterface
         }
 
         @Override
-        public boolean next(List<KeyValue> results, String metric)
-            throws IOException {
-          return next(results, -1, metric);
-        }
-
-        @Override
         public boolean next(List<KeyValue> results, int limit)
             throws IOException{
-          return next(results, limit, null);
-        }
-
-        @Override
-        public boolean next(List<KeyValue> results, int limit, String metric)
-            throws IOException {
           List<KeyValue> internalResults = new ArrayList<KeyValue>();
           boolean hasMore;
           do {
-            hasMore = scanner.next(internalResults, limit, metric);
+            hasMore = scanner.next(internalResults, limit);
             if (!internalResults.isEmpty()) {
               long row = Bytes.toLong(internalResults.get(0).getRow());
               if (row % 2 == 0) {

Modified: hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java?rev=1467486&r1=1467485&r2=1467486&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java (original)
+++ hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java Fri Apr 12 21:47:26 2013
@@ -31,6 +31,9 @@ import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
+import static org.junit.Assert.*;
+
+import java.io.IOException;
 
 
 @Category(MediumTests.class)
@@ -139,7 +142,7 @@ public class TestRegionServerMetrics {
           .getSource()
           .getAggregateSource();
       String prefix = "table."+tableNameString + ".region." + i.getEncodedName();
-      metricsHelper.assertCounter(prefix + ".getCount", 10, agg);
+      metricsHelper.assertCounter(prefix + ".getNumOps", 10, agg);
       metricsHelper.assertCounter(prefix + ".mutateCount", 30, agg);
     }
 
@@ -309,4 +312,43 @@ public class TestRegionServerMetrics {
 
     t.close();
   }
+
+  @Test
+  public void testScanNext() throws IOException {
+    String tableNameString = "testScanNext";
+    byte[] tableName = Bytes.toBytes(tableNameString);
+    byte[] cf = Bytes.toBytes("d");
+    byte[] qualifier = Bytes.toBytes("qual");
+    byte[] val = Bytes.toBytes("One");
+
+
+    TEST_UTIL.createTable(tableName, cf);
+    HTable t = new HTable(conf, tableName);
+    t.setAutoFlush(false);
+    for (int insertCount =0; insertCount < 100; insertCount++) {
+      Put p = new Put(Bytes.toBytes("" + insertCount + "row"));
+      p.add(cf, qualifier, val);
+      t.put(p);
+    }
+    t.flushCommits();
+
+    Scan s = new Scan();
+    s.setBatch(1);
+    s.setCaching(1);
+    ResultScanner resultScanners = t.getScanner(s);
+
+    for (int nextCount = 0; nextCount < 30; nextCount++) {
+      Result result = resultScanners.next();
+      assertNotNull(result);
+      assertEquals(1, result.size());
+    }
+    for ( HRegionInfo i:t.getRegionLocations().keySet()) {
+      MetricsRegionAggregateSource agg = rs.getRegion(i.getRegionName())
+          .getMetrics()
+          .getSource()
+          .getAggregateSource();
+      String prefix = "table."+tableNameString + ".region." + i.getEncodedName();
+      metricsHelper.assertCounter(prefix + ".scanNextNumOps", 30, agg);
+    }
+  }
 }