You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2017/01/06 21:07:24 UTC

hbase git commit: HBASE-17408 Introduce per request limit by number of mutations (ChiaPing Tsai)

Repository: hbase
Updated Branches:
  refs/heads/master 4c98f97c3 -> b2a9be02a


HBASE-17408 Introduce per request limit by number of mutations (ChiaPing Tsai)


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/b2a9be02
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/b2a9be02
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/b2a9be02

Branch: refs/heads/master
Commit: b2a9be02ac10908438dc84e9d483bc8785d7ce19
Parents: 4c98f97
Author: tedyu <yu...@gmail.com>
Authored: Fri Jan 6 13:07:15 2017 -0800
Committer: tedyu <yu...@gmail.com>
Committed: Fri Jan 6 13:07:15 2017 -0800

----------------------------------------------------------------------
 .../hbase/client/SimpleRequestController.java   | 164 +++++++++++++------
 .../client/TestSimpleRequestController.java     |  91 +++++++---
 .../hbase/coprocessor/RegionServerObserver.java |   2 +-
 3 files changed, 182 insertions(+), 75 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/b2a9be02/hbase-client/src/main/java/org/apache/hadoop/hbase/client/SimpleRequestController.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/SimpleRequestController.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/SimpleRequestController.java
index 6343af6..de2cbe1 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/SimpleRequestController.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/SimpleRequestController.java
@@ -49,30 +49,39 @@ import org.apache.hadoop.hbase.util.EnvironmentEdge;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
 
 /**
- * Holds back the request if the submitted size or number has reached the
- * threshold.
+ * Holds back the requests if they reach any thresholds.
  */
 @InterfaceAudience.Private
 @InterfaceStability.Evolving
 class SimpleRequestController implements RequestController {
   private static final Log LOG = LogFactory.getLog(SimpleRequestController.class);
   /**
-   * The maximum size of single RegionServer.
+   * The maximum heap size for each request.
    */
   public static final String HBASE_CLIENT_MAX_PERREQUEST_HEAPSIZE = "hbase.client.max.perrequest.heapsize";
 
   /**
-   * Default value of #HBASE_CLIENT_MAX_PERREQUEST_HEAPSIZE
+   * Default value of {@link #HBASE_CLIENT_MAX_PERREQUEST_HEAPSIZE}.
    */
   @VisibleForTesting
   static final long DEFAULT_HBASE_CLIENT_MAX_PERREQUEST_HEAPSIZE = 4194304;
 
   /**
+   * The maximum number of rows for each request.
+   */
+  public static final String HBASE_CLIENT_MAX_PERREQUEST_ROWS = "hbase.client.max.perrequest.rows";
+  /**
+   * Default value of {@link #HBASE_CLIENT_MAX_PERREQUEST_ROWS}.
+   */
+  @VisibleForTesting
+  static final long DEFAULT_HBASE_CLIENT_MAX_PERREQUEST_ROWS = 2048;
+
+  /**
    * The maximum size of submit.
    */
   public static final String HBASE_CLIENT_MAX_SUBMIT_HEAPSIZE = "hbase.client.max.submit.heapsize";
   /**
-   * Default value of #HBASE_CLIENT_MAX_SUBMIT_HEAPSIZE
+   * Default value of {@link #HBASE_CLIENT_MAX_SUBMIT_HEAPSIZE}.
    */
   @VisibleForTesting
   static final long DEFAULT_HBASE_CLIENT_MAX_SUBMIT_HEAPSIZE = DEFAULT_HBASE_CLIENT_MAX_PERREQUEST_HEAPSIZE;
@@ -89,9 +98,13 @@ class SimpleRequestController implements RequestController {
   private final int maxTotalConcurrentTasks;
 
   /**
-   * The max heap size of all tasks simultaneously executed on a server.
+   * The maximum heap size for each request.
    */
   private final long maxHeapSizePerRequest;
+  /**
+   * The maximum number of rows for each request.
+   */
+  private final long maxRowsPerRequest;
   private final long maxHeapSizeSubmit;
   /**
    * The number of tasks we run in parallel on a single region. With 1 (the
@@ -116,41 +129,46 @@ class SimpleRequestController implements RequestController {
   private static final int DEFAULT_THRESHOLD_TO_LOG_REGION_DETAILS = 2;
   private final int thresholdToLogRegionDetails;
   SimpleRequestController(final Configuration conf) {
-    this.maxTotalConcurrentTasks = conf.getInt(HConstants.HBASE_CLIENT_MAX_TOTAL_TASKS,
+    this.maxTotalConcurrentTasks = checkAndGet(conf,
+            HConstants.HBASE_CLIENT_MAX_TOTAL_TASKS,
             HConstants.DEFAULT_HBASE_CLIENT_MAX_TOTAL_TASKS);
-    this.maxConcurrentTasksPerServer = conf.getInt(HConstants.HBASE_CLIENT_MAX_PERSERVER_TASKS,
+    this.maxConcurrentTasksPerServer = checkAndGet(conf,
+            HConstants.HBASE_CLIENT_MAX_PERSERVER_TASKS,
             HConstants.DEFAULT_HBASE_CLIENT_MAX_PERSERVER_TASKS);
-    this.maxConcurrentTasksPerRegion = conf.getInt(HConstants.HBASE_CLIENT_MAX_PERREGION_TASKS,
+    this.maxConcurrentTasksPerRegion = checkAndGet(conf,
+            HConstants.HBASE_CLIENT_MAX_PERREGION_TASKS,
             HConstants.DEFAULT_HBASE_CLIENT_MAX_PERREGION_TASKS);
-    this.maxHeapSizePerRequest = conf.getLong(HBASE_CLIENT_MAX_PERREQUEST_HEAPSIZE,
+    this.maxHeapSizePerRequest = checkAndGet(conf,
+            HBASE_CLIENT_MAX_PERREQUEST_HEAPSIZE,
             DEFAULT_HBASE_CLIENT_MAX_PERREQUEST_HEAPSIZE);
-    this.maxHeapSizeSubmit = conf.getLong(HBASE_CLIENT_MAX_SUBMIT_HEAPSIZE, DEFAULT_HBASE_CLIENT_MAX_SUBMIT_HEAPSIZE);
-    this.thresholdToLogUndoneTaskDetails =
-        conf.getInt(THRESHOLD_TO_LOG_UNDONE_TASK_DETAILS,
+    this.maxRowsPerRequest = checkAndGet(conf,
+            HBASE_CLIENT_MAX_PERREQUEST_ROWS,
+            DEFAULT_HBASE_CLIENT_MAX_PERREQUEST_ROWS);
+    this.maxHeapSizeSubmit = checkAndGet(conf,
+            HBASE_CLIENT_MAX_SUBMIT_HEAPSIZE,
+            DEFAULT_HBASE_CLIENT_MAX_SUBMIT_HEAPSIZE);
+    this.thresholdToLogUndoneTaskDetails = conf.getInt(
+          THRESHOLD_TO_LOG_UNDONE_TASK_DETAILS,
           DEFAULT_THRESHOLD_TO_LOG_UNDONE_TASK_DETAILS);
-    this.thresholdToLogRegionDetails =
-        conf.getInt(THRESHOLD_TO_LOG_REGION_DETAILS,
+    this.thresholdToLogRegionDetails = conf.getInt(
+          THRESHOLD_TO_LOG_REGION_DETAILS,
           DEFAULT_THRESHOLD_TO_LOG_REGION_DETAILS);
-    if (this.maxTotalConcurrentTasks <= 0) {
-      throw new IllegalArgumentException("maxTotalConcurrentTasks=" + maxTotalConcurrentTasks);
-    }
-    if (this.maxConcurrentTasksPerServer <= 0) {
-      throw new IllegalArgumentException("maxConcurrentTasksPerServer="
-              + maxConcurrentTasksPerServer);
-    }
-    if (this.maxConcurrentTasksPerRegion <= 0) {
-      throw new IllegalArgumentException("maxConcurrentTasksPerRegion="
-              + maxConcurrentTasksPerRegion);
-    }
-    if (this.maxHeapSizePerRequest <= 0) {
-      throw new IllegalArgumentException("maxHeapSizePerServer="
-              + maxHeapSizePerRequest);
+  }
+
+  private static int checkAndGet(Configuration conf, String key, int defaultValue) {
+    int value = conf.getInt(key, defaultValue);
+    if (value <= 0) {
+      throw new IllegalArgumentException(key + "=" + value);
     }
+    return value;
+  }
 
-    if (this.maxHeapSizeSubmit <= 0) {
-      throw new IllegalArgumentException("maxHeapSizeSubmit="
-              + maxHeapSizeSubmit);
+  private static long checkAndGet(Configuration conf, String key, long defaultValue) {
+    long value = conf.getLong(key, defaultValue);
+    if (value <= 0) {
+      throw new IllegalArgumentException(key + "=" + value);
     }
+    return value;
   }
 
   @VisibleForTesting
@@ -163,10 +181,10 @@ class SimpleRequestController implements RequestController {
         if (isEnd) {
           return ReturnCode.END;
         }
-        long rowSize = (row instanceof Mutation) ? ((Mutation) row).heapSize() : 0;
+        long heapSizeOfRow = (row instanceof Mutation) ? ((Mutation) row).heapSize() : 0;
         ReturnCode code = ReturnCode.INCLUDE;
         for (RowChecker checker : checkers) {
-          switch (checker.canTakeOperation(loc, rowSize)) {
+          switch (checker.canTakeOperation(loc, heapSizeOfRow)) {
             case END:
               isEnd = true;
               code = ReturnCode.END;
@@ -183,7 +201,7 @@ class SimpleRequestController implements RequestController {
           }
         }
         for (RowChecker checker : checkers) {
-          checker.notifyFinal(code, loc, rowSize);
+          checker.notifyFinal(code, loc, heapSizeOfRow);
         }
         return code;
       }
@@ -208,15 +226,16 @@ class SimpleRequestController implements RequestController {
 
   @Override
   public Checker newChecker() {
-    List<RowChecker> checkers = new ArrayList<>(3);
+    List<RowChecker> checkers = new ArrayList<>(4);
     checkers.add(new TaskCountChecker(maxTotalConcurrentTasks,
             maxConcurrentTasksPerServer,
             maxConcurrentTasksPerRegion,
             tasksInProgress,
             taskCounterPerServer,
             taskCounterPerRegion));
-    checkers.add(new RequestSizeChecker(maxHeapSizePerRequest));
+    checkers.add(new RequestHeapSizeChecker(maxHeapSizePerRequest));
     checkers.add(new SubmittedSizeChecker(maxHeapSizeSubmit));
+    checkers.add(new RequestRowsChecker(maxRowsPerRequest));
     return newChecker(checkers);
   }
 
@@ -323,7 +342,7 @@ class SimpleRequestController implements RequestController {
     }
 
     @Override
-    public ReturnCode canTakeOperation(HRegionLocation loc, long rowSize) {
+    public ReturnCode canTakeOperation(HRegionLocation loc, long heapSizeOfRow) {
       if (heapSize >= maxHeapSizeSubmit) {
         return ReturnCode.END;
       }
@@ -331,9 +350,9 @@ class SimpleRequestController implements RequestController {
     }
 
     @Override
-    public void notifyFinal(ReturnCode code, HRegionLocation loc, long rowSize) {
+    public void notifyFinal(ReturnCode code, HRegionLocation loc, long heapSizeOfRow) {
       if (code == ReturnCode.INCLUDE) {
-        heapSize += rowSize;
+        heapSize += heapSizeOfRow;
       }
     }
 
@@ -413,11 +432,11 @@ class SimpleRequestController implements RequestController {
      * tasks for server.
      *
      * @param loc
-     * @param rowSize
+     * @param heapSizeOfRow
      * @return
      */
     @Override
-    public ReturnCode canTakeOperation(HRegionLocation loc, long rowSize) {
+    public ReturnCode canTakeOperation(HRegionLocation loc, long heapSizeOfRow) {
 
       HRegionInfo regionInfo = loc.getRegionInfo();
       if (regionsIncluded.contains(regionInfo)) {
@@ -444,7 +463,7 @@ class SimpleRequestController implements RequestController {
     }
 
     @Override
-    public void notifyFinal(ReturnCode code, HRegionLocation loc, long rowSize) {
+    public void notifyFinal(ReturnCode code, HRegionLocation loc, long heapSizeOfRow) {
       if (code == ReturnCode.INCLUDE) {
         regionsIncluded.add(loc.getRegionInfo());
         serversIncluded.add(loc.getServerName());
@@ -454,15 +473,54 @@ class SimpleRequestController implements RequestController {
   }
 
   /**
-   * limit the request size for each regionserver.
+   * limit the number of rows for each request.
+   */
+  @VisibleForTesting
+  static class RequestRowsChecker implements RowChecker {
+
+    private final long maxRowsPerRequest;
+    private final Map<ServerName, Long> serverRows = new HashMap<>();
+
+    RequestRowsChecker(final long maxRowsPerRequest) {
+      this.maxRowsPerRequest = maxRowsPerRequest;
+    }
+
+    @Override
+    public void reset() {
+      serverRows.clear();
+    }
+
+    @Override
+    public ReturnCode canTakeOperation(HRegionLocation loc, long heapSizeOfRow) {
+      long currentRows = serverRows.containsKey(loc.getServerName())
+              ? serverRows.get(loc.getServerName()) : 0L;
+      // accept at least one row
+      if (currentRows == 0 || currentRows < maxRowsPerRequest) {
+        return ReturnCode.INCLUDE;
+      }
+      return ReturnCode.SKIP;
+    }
+
+    @Override
+    public void notifyFinal(ReturnCode code, HRegionLocation loc, long heapSizeOfRow) {
+      if (code == ReturnCode.INCLUDE) {
+        long currentRows = serverRows.containsKey(loc.getServerName())
+                ? serverRows.get(loc.getServerName()) : 0L;
+        serverRows.put(loc.getServerName(), currentRows + 1);
+      }
+    }
+  }
+
+  /**
+   * limit the heap size for each request.
    */
   @VisibleForTesting
-  static class RequestSizeChecker implements RowChecker {
+  static class RequestHeapSizeChecker implements RowChecker {
 
     private final long maxHeapSizePerRequest;
     private final Map<ServerName, Long> serverRequestSizes = new HashMap<>();
 
-    RequestSizeChecker(final long maxHeapSizePerRequest) {
+    RequestHeapSizeChecker(final long maxHeapSizePerRequest) {
       this.maxHeapSizePerRequest = maxHeapSizePerRequest;
     }
 
@@ -472,23 +530,23 @@ class SimpleRequestController implements RequestController {
     }
 
     @Override
-    public ReturnCode canTakeOperation(HRegionLocation loc, long rowSize) {
+    public ReturnCode canTakeOperation(HRegionLocation loc, long heapSizeOfRow) {
       // Is it ok for limit of request size?
       long currentRequestSize = serverRequestSizes.containsKey(loc.getServerName())
               ? serverRequestSizes.get(loc.getServerName()) : 0L;
       // accept at least one request
-      if (currentRequestSize == 0 || currentRequestSize + rowSize <= maxHeapSizePerRequest) {
+      if (currentRequestSize == 0 || currentRequestSize + heapSizeOfRow <= maxHeapSizePerRequest) {
         return ReturnCode.INCLUDE;
       }
       return ReturnCode.SKIP;
     }
 
     @Override
-    public void notifyFinal(ReturnCode code, HRegionLocation loc, long rowSize) {
+    public void notifyFinal(ReturnCode code, HRegionLocation loc, long heapSizeOfRow) {
       if (code == ReturnCode.INCLUDE) {
         long currentRequestSize = serverRequestSizes.containsKey(loc.getServerName())
                 ? serverRequestSizes.get(loc.getServerName()) : 0L;
-        serverRequestSizes.put(loc.getServerName(), currentRequestSize + rowSize);
+        serverRequestSizes.put(loc.getServerName(), currentRequestSize + heapSizeOfRow);
       }
     }
   }
@@ -499,7 +557,7 @@ class SimpleRequestController implements RequestController {
   @VisibleForTesting
   interface RowChecker {
 
-    ReturnCode canTakeOperation(HRegionLocation loc, long rowSize);
+    ReturnCode canTakeOperation(HRegionLocation loc, long heapSizeOfRow);
 
     /**
      * Add the final ReturnCode to the checker. The ReturnCode may be reversed,
@@ -507,9 +565,9 @@ class SimpleRequestController implements RequestController {
      *
      * @param code The final decision
      * @param loc the destination of data
-     * @param rowSize the data size
+     * @param heapSizeOfRow the data size
      */
-    void notifyFinal(ReturnCode code, HRegionLocation loc, long rowSize);
+    void notifyFinal(ReturnCode code, HRegionLocation loc, long heapSizeOfRow);
 
     /**
      * Reset the inner state.

http://git-wip-us.apache.org/repos/asf/hbase/blob/b2a9be02/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestSimpleRequestController.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestSimpleRequestController.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestSimpleRequestController.java
index b46e572..c0ece3c 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestSimpleRequestController.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestSimpleRequestController.java
@@ -56,7 +56,6 @@ public class TestSimpleRequestController {
   private static final byte[] DUMMY_BYTES_3 = "DUMMY_BYTES_3".getBytes();
   private static final ServerName SN = ServerName.valueOf("s1:1,1");
   private static final ServerName SN2 = ServerName.valueOf("s2:2,2");
-  private static final ServerName SN3 = ServerName.valueOf("s3:3,3");
   private static final HRegionInfo HRI1
           = new HRegionInfo(DUMMY_TABLE, DUMMY_BYTES_1, DUMMY_BYTES_2, false, 1);
   private static final HRegionInfo HRI2
@@ -68,7 +67,7 @@ public class TestSimpleRequestController {
   private static final HRegionLocation LOC3 = new HRegionLocation(HRI3, SN2);
 
   @Test
-  public void testIllegalRequestSize() {
+  public void testIllegalRequestHeapSize() {
     testIllegalArgument(SimpleRequestController.HBASE_CLIENT_MAX_PERREQUEST_HEAPSIZE, -1);
   }
 
@@ -87,9 +86,14 @@ public class TestSimpleRequestController {
     testIllegalArgument(SimpleRequestController.HBASE_CLIENT_MAX_SUBMIT_HEAPSIZE, -1);
   }
 
+  @Test
+  public void testIllegalRequestRows() {
+    testIllegalArgument(SimpleRequestController.HBASE_CLIENT_MAX_PERREQUEST_ROWS, -1);
+  }
+
   private void testIllegalArgument(String key, long value) {
     Configuration conf = HBaseConfiguration.create();
-    conf.setLong(SimpleRequestController.HBASE_CLIENT_MAX_PERREQUEST_HEAPSIZE, -1);
+    conf.setLong(key, value);
     try {
       SimpleRequestController controller = new SimpleRequestController(conf);
       fail("The " + key + " must be bigger than zero");
@@ -121,7 +125,7 @@ public class TestSimpleRequestController {
             tasksInProgress, taskCounterPerServer, taskCounterPerRegion);
     final long maxHeapSizePerRequest = 2 * 1024 * 1024;
     // unlimiited
-    SimpleRequestController.RequestSizeChecker sizeChecker = new SimpleRequestController.RequestSizeChecker(maxHeapSizePerRequest);
+    SimpleRequestController.RequestHeapSizeChecker sizeChecker = new SimpleRequestController.RequestHeapSizeChecker(maxHeapSizePerRequest);
     RequestController.Checker checker = SimpleRequestController.newChecker(Arrays.asList(countChecker, sizeChecker));
     ReturnCode loc1Code = checker.canTakeRow(LOC1, createPut(maxHeapSizePerRequest));
     assertEquals(ReturnCode.INCLUDE, loc1Code);
@@ -151,10 +155,10 @@ public class TestSimpleRequestController {
   }
 
   @Test
-  public void testRequestSizeCheckerr() throws IOException {
+  public void testRequestHeapSizeChecker() throws IOException {
     final long maxHeapSizePerRequest = 2 * 1024 * 1024;
-    SimpleRequestController.RequestSizeChecker checker
-            = new SimpleRequestController.RequestSizeChecker(maxHeapSizePerRequest);
+    SimpleRequestController.RequestHeapSizeChecker checker
+            = new SimpleRequestController.RequestHeapSizeChecker(maxHeapSizePerRequest);
 
     // inner state is unchanged.
     for (int i = 0; i != 10; ++i) {
@@ -193,6 +197,51 @@ public class TestSimpleRequestController {
   }
 
   @Test
+  public void testRequestRowsChecker() throws IOException {
+    final long maxRowCount = 100;
+    SimpleRequestController.RequestRowsChecker checker
+      = new SimpleRequestController.RequestRowsChecker(maxRowCount);
+
+    final long heapSizeOfRow = 100; //unused
+    // inner state is unchanged.
+    for (int i = 0; i != 10; ++i) {
+      ReturnCode code = checker.canTakeOperation(LOC1, heapSizeOfRow);
+      assertEquals(ReturnCode.INCLUDE, code);
+      code = checker.canTakeOperation(LOC2, heapSizeOfRow);
+      assertEquals(ReturnCode.INCLUDE, code);
+    }
+
+    // accept the data located on LOC1 region.
+    for (int i = 0; i != maxRowCount; ++i) {
+      ReturnCode acceptCode = checker.canTakeOperation(LOC1, heapSizeOfRow);
+      assertEquals(ReturnCode.INCLUDE, acceptCode);
+      checker.notifyFinal(acceptCode, LOC1, heapSizeOfRow);
+    }
+
+    // the sn server reachs the limit.
+    for (int i = 0; i != 10; ++i) {
+      ReturnCode code = checker.canTakeOperation(LOC1, heapSizeOfRow);
+      assertNotEquals(ReturnCode.INCLUDE, code);
+      code = checker.canTakeOperation(LOC2, heapSizeOfRow);
+      assertNotEquals(ReturnCode.INCLUDE, code);
+    }
+
+    // the request to sn2 server should be accepted.
+    for (int i = 0; i != 10; ++i) {
+      ReturnCode code = checker.canTakeOperation(LOC3, heapSizeOfRow);
+      assertEquals(ReturnCode.INCLUDE, code);
+    }
+
+    checker.reset();
+    for (int i = 0; i != 10; ++i) {
+      ReturnCode code = checker.canTakeOperation(LOC1, heapSizeOfRow);
+      assertEquals(ReturnCode.INCLUDE, code);
+      code = checker.canTakeOperation(LOC2, heapSizeOfRow);
+      assertEquals(ReturnCode.INCLUDE, code);
+    }
+  }
+
+  @Test
   public void testSubmittedSizeChecker() {
     final long maxHeapSizeSubmit = 2 * 1024 * 1024;
     SimpleRequestController.SubmittedSizeChecker checker
@@ -224,7 +273,7 @@ public class TestSimpleRequestController {
 
   @Test
   public void testTaskCountChecker() throws InterruptedIOException {
-    long rowSize = 12345;
+    long heapSizeOfRow = 12345;
     int maxTotalConcurrentTasks = 100;
     int maxConcurrentTasksPerServer = 2;
     int maxConcurrentTasksPerRegion = 1;
@@ -239,13 +288,13 @@ public class TestSimpleRequestController {
 
     // inner state is unchanged.
     for (int i = 0; i != 10; ++i) {
-      ReturnCode code = checker.canTakeOperation(LOC1, rowSize);
+      ReturnCode code = checker.canTakeOperation(LOC1, heapSizeOfRow);
       assertEquals(ReturnCode.INCLUDE, code);
     }
     // add LOC1 region.
-    ReturnCode code = checker.canTakeOperation(LOC1, rowSize);
+    ReturnCode code = checker.canTakeOperation(LOC1, heapSizeOfRow);
     assertEquals(ReturnCode.INCLUDE, code);
-    checker.notifyFinal(code, LOC1, rowSize);
+    checker.notifyFinal(code, LOC1, heapSizeOfRow);
 
     // fill the task slots for LOC1.
     taskCounterPerRegion.put(LOC1.getRegionInfo().getRegionName(), new AtomicInteger(100));
@@ -253,9 +302,9 @@ public class TestSimpleRequestController {
 
     // the region was previously accepted, so it must be accpted now.
     for (int i = 0; i != maxConcurrentTasksPerRegion * 5; ++i) {
-      ReturnCode includeCode = checker.canTakeOperation(LOC1, rowSize);
+      ReturnCode includeCode = checker.canTakeOperation(LOC1, heapSizeOfRow);
       assertEquals(ReturnCode.INCLUDE, includeCode);
-      checker.notifyFinal(includeCode, LOC1, rowSize);
+      checker.notifyFinal(includeCode, LOC1, heapSizeOfRow);
     }
 
     // fill the task slots for LOC3.
@@ -264,9 +313,9 @@ public class TestSimpleRequestController {
 
     // no task slots.
     for (int i = 0; i != maxConcurrentTasksPerRegion * 5; ++i) {
-      ReturnCode excludeCode = checker.canTakeOperation(LOC3, rowSize);
+      ReturnCode excludeCode = checker.canTakeOperation(LOC3, heapSizeOfRow);
       assertNotEquals(ReturnCode.INCLUDE, excludeCode);
-      checker.notifyFinal(excludeCode, LOC3, rowSize);
+      checker.notifyFinal(excludeCode, LOC3, heapSizeOfRow);
     }
 
     // release the tasks for LOC3.
@@ -274,15 +323,15 @@ public class TestSimpleRequestController {
     taskCounterPerServer.put(LOC3.getServerName(), new AtomicInteger(0));
 
     // add LOC3 region.
-    ReturnCode code3 = checker.canTakeOperation(LOC3, rowSize);
+    ReturnCode code3 = checker.canTakeOperation(LOC3, heapSizeOfRow);
     assertEquals(ReturnCode.INCLUDE, code3);
-    checker.notifyFinal(code3, LOC3, rowSize);
+    checker.notifyFinal(code3, LOC3, heapSizeOfRow);
 
     // the region was previously accepted, so it must be accpted now.
     for (int i = 0; i != maxConcurrentTasksPerRegion * 5; ++i) {
-      ReturnCode includeCode = checker.canTakeOperation(LOC3, rowSize);
+      ReturnCode includeCode = checker.canTakeOperation(LOC3, heapSizeOfRow);
       assertEquals(ReturnCode.INCLUDE, includeCode);
-      checker.notifyFinal(includeCode, LOC3, rowSize);
+      checker.notifyFinal(includeCode, LOC3, heapSizeOfRow);
     }
 
     checker.reset();
@@ -290,9 +339,9 @@ public class TestSimpleRequestController {
     // but checker have reseted and task slots for LOC1 is full.
     // So it must be rejected now.
     for (int i = 0; i != maxConcurrentTasksPerRegion * 5; ++i) {
-      ReturnCode includeCode = checker.canTakeOperation(LOC1, rowSize);
+      ReturnCode includeCode = checker.canTakeOperation(LOC1, heapSizeOfRow);
       assertNotEquals(ReturnCode.INCLUDE, includeCode);
-      checker.notifyFinal(includeCode, LOC1, rowSize);
+      checker.notifyFinal(includeCode, LOC1, heapSizeOfRow);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/b2a9be02/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionServerObserver.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionServerObserver.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionServerObserver.java
index e205381..77d9d57 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionServerObserver.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionServerObserver.java
@@ -41,7 +41,7 @@ public interface RegionServerObserver extends Coprocessor {
     throws IOException;
 
   /**
-   * Called before the regions merge. 
+   * Called before the regions merge.
    * Call {@link org.apache.hadoop.hbase.coprocessor.ObserverContext#bypass()} to skip the merge.
    * @throws IOException if an error occurred on the coprocessor
    * @param ctx