hbase-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ecl...@apache.org
Subject hbase git commit: HBASE-13471 Fix a possible infinite loop in doMiniBatchMutation
Date Tue, 21 Apr 2015 22:29:25 GMT
Repository: hbase
Updated Branches:
  refs/heads/0.98 3450b6f6c -> 0c1b11284

HBASE-13471 Fix a possible infinite loop in doMiniBatchMutation

Summary: in doMiniBatchMutation it is possible to get into an infinite loop when a query has
a row that is not in the region. If the batch had an invalid row, the row lock further down
the function would fail to acquire because it was an invalid row. However we'd catch the exception
and improperly treat it as if we had not acquired the lock and then try acquiring the lock
again. Thus once we got into this state we'd be stuck in an infinite loop. Worse yet, this
infiite loop would occur with the readLock held. So any other opertaions such as doClose()
would be locked out and stuck. The patch is to check whether the row is valid and short circuit
the failure when it doesn't work.

Test Plan: IntegrationTestReplication would consistently fail when trying to disable large
tables before the fix. After the test the tests pass consistently.

Reviewers: eclark

Subscribers: asameet

Differential Revision: https://reviews.facebook.net/D37437

Signed-off-by: Elliott Clark <eclark@apache.org>

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

Branch: refs/heads/0.98
Commit: 0c1b11284869f19b1a13ad5d24255c4f29d9cb1c
Parents: 3450b6f
Author: Rajesh Nishtala <rajeshn@fb.com>
Authored: Mon Apr 20 17:34:25 2015 -0700
Committer: Elliott Clark <eclark@apache.org>
Committed: Tue Apr 21 15:26:08 2015 -0700

 .../java/org/apache/hadoop/hbase/regionserver/HRegion.java   | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
index 28ca92d..d5e2e86 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
@@ -2408,6 +2408,7 @@ public class HRegion implements HeapSize { // , Writable{
           } else {
             prepareDelete((Delete) mutation);
+          checkRow(mutation.getRow(), "doMiniBatchMutation");
         } catch (NoSuchColumnFamilyException nscf) {
           LOG.warn("No such column family in batch mutation", nscf);
           batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(
@@ -2420,6 +2421,12 @@ public class HRegion implements HeapSize { // , Writable{
               OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());
+        } catch (WrongRegionException we) {
+          LOG.warn("Batch mutation had a row that does not belong to this region", we);
+          batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(
+              OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());
+          lastIndexExclusive++;
+          continue;
         // If we haven't got any rows in our batch, we should block to
@@ -3664,7 +3671,6 @@ public class HRegion implements HeapSize { // , Writable{
    * started (the calling thread has already acquired the region-close-lock).
   protected RowLock getRowLockInternal(byte[] row, boolean waitForLock) throws IOException
-    checkRow(row, "row lock");
     HashedBytes rowKey = new HashedBytes(row);
     RowLockContext rowLockContext = new RowLockContext(rowKey);

View raw message