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());
+ }
}