You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2019/02/04 13:03:24 UTC

[hbase] branch branch-2 updated: HBASE-21795 Client application may get stuck (time bound) if a table modify op is called immediately after split op

This is an automated email from the ASF dual-hosted git repository.

zhangduo pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-2 by this push:
     new 4b2c5ae  HBASE-21795 Client application may get stuck (time bound) if a table modify op is called immediately after split op
4b2c5ae is described below

commit 4b2c5ae632736c75253e943022bc16784989acb1
Author: Nihal Jain <ni...@gmail.com>
AuthorDate: Mon Jan 28 14:05:25 2019 +0530

    HBASE-21795 Client application may get stuck (time bound) if a table modify op is called immediately after split op
    
    Signed-off-by: zhangduo <zh...@apache.org>
---
 .../hbase/master/assignment/AssignmentManager.java |  4 +-
 .../org/apache/hadoop/hbase/client/TestAdmin2.java | 61 ++++++++++++++++++++++
 2 files changed, 64 insertions(+), 1 deletion(-)

diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
index 85fffc3..c12f806 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
@@ -1412,7 +1412,9 @@ public class AssignmentManager {
     final List<RegionState> states = regionStates.getTableRegionStates(tableName);
     int ritCount = 0;
     for (RegionState regionState: states) {
-      if (!regionState.isOpened()) ritCount++;
+      if (!regionState.isOpened() && !regionState.isSplit()) {
+        ritCount++;
+      }
     }
     return new Pair<Integer, Integer>(ritCount, states.size());
   }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin2.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin2.java
index 97c7b9b..2c14eaf 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin2.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin2.java
@@ -46,6 +46,7 @@ import org.apache.hadoop.hbase.TableNotDisabledException;
 import org.apache.hadoop.hbase.TableNotEnabledException;
 import org.apache.hadoop.hbase.TableNotFoundException;
 import org.apache.hadoop.hbase.UnknownRegionException;
+import org.apache.hadoop.hbase.Waiter.Predicate;
 import org.apache.hadoop.hbase.ZooKeeperConnectionException;
 import org.apache.hadoop.hbase.constraint.ConstraintException;
 import org.apache.hadoop.hbase.ipc.HBaseRpcController;
@@ -793,4 +794,64 @@ public class TestAdmin2 {
       Assert.assertEquals(expectedStoreFilesSize, store.getSize());
     }
   }
+
+  @Test
+  public void testTableSplitFollowedByModify() throws Exception {
+    final TableName tableName = TableName.valueOf(name.getMethodName());
+    TEST_UTIL.createTable(tableName, Bytes.toBytes("f"));
+
+    // get the original table region count
+    List<RegionInfo> regions = admin.getRegions(tableName);
+    int originalCount = regions.size();
+    assertEquals(1, originalCount);
+
+    // split the table and wait until region count increases
+    admin.split(tableName, Bytes.toBytes(3));
+    TEST_UTIL.waitFor(30000, new Predicate<Exception>() {
+
+      @Override
+      public boolean evaluate() throws Exception {
+        return admin.getRegions(tableName).size() > originalCount;
+      }
+    });
+
+    // do some table modification
+    TableDescriptor tableDesc = TableDescriptorBuilder.newBuilder(admin.getDescriptor(tableName))
+        .setMaxFileSize(11111111)
+        .build();
+    admin.modifyTable(tableDesc);
+    assertEquals(11111111, admin.getDescriptor(tableName).getMaxFileSize());
+  }
+
+  @Test
+  public void testTableMergeFollowedByModify() throws Exception {
+    final TableName tableName = TableName.valueOf(name.getMethodName());
+    TEST_UTIL.createTable(tableName, new byte[][] { Bytes.toBytes("f") },
+      new byte[][] { Bytes.toBytes(3) });
+
+    // assert we have at least 2 regions in the table
+    List<RegionInfo> regions = admin.getRegions(tableName);
+    int originalCount = regions.size();
+    assertTrue(originalCount >= 2);
+
+    byte[] nameOfRegionA = regions.get(0).getEncodedNameAsBytes();
+    byte[] nameOfRegionB = regions.get(1).getEncodedNameAsBytes();
+
+    // merge the table regions and wait until region count decreases
+    admin.mergeRegionsAsync(nameOfRegionA, nameOfRegionB, true);
+    TEST_UTIL.waitFor(30000, new Predicate<Exception>() {
+
+      @Override
+      public boolean evaluate() throws Exception {
+        return admin.getRegions(tableName).size() < originalCount;
+      }
+    });
+
+    // do some table modification
+    TableDescriptor tableDesc = TableDescriptorBuilder.newBuilder(admin.getDescriptor(tableName))
+        .setMaxFileSize(11111111)
+        .build();
+    admin.modifyTable(tableDesc);
+    assertEquals(11111111, admin.getDescriptor(tableName).getMaxFileSize());
+  }
 }