diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java index fe94f42..0a28967 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java @@ -1587,6 +1587,8 @@ public class AssignmentManager extends ZooKeeperListener { EventType.RS_ZK_REGION_CLOSED, EventType.M_ZK_REGION_OFFLINE); } replicasToClose.remove(regionInfo); + //Set servername in regionstate to null, see HBASE-18014 + getRegionStates().updateRegionState(regionInfo, State.OFFLINE, null); regionOffline(regionInfo); } 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 051998b..95e7413 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 @@ -88,6 +88,9 @@ public class TestAdmin2 { TEST_UTIL.getConfiguration().setInt("hbase.regionserver.metahandler.count", 30); TEST_UTIL.getConfiguration().setBoolean( "hbase.master.enabletable.roundrobin", true); + //Set a very short keeptime for processedServers, see HBASE-18014 + TEST_UTIL.getConfiguration().setLong("hbase.master.maximum.logsplit.keeptime", 100); + TEST_UTIL.getConfiguration().setInt("hbase.client.sync.wait.timeout.msec", 10000); TEST_UTIL.startMiniCluster(3); } @@ -790,4 +793,33 @@ public class TestAdmin2 { // Current state should be the original state again assertEquals(initialState, admin.isNormalizerEnabled()); } + + /** + * a UT for HBASE-18014 + * @throws Exception + */ + @Test (timeout=3000000) + public void testEnableTableAfterprocessedServersCleaned() throws Exception { + String TABLENAME = "testEnableTableAfterprocessedServersCleaned"; + HBaseAdmin admin = TEST_UTIL.getHBaseAdmin(); + HTableDescriptor hds = new HTableDescriptor(TableName.valueOf(TABLENAME)); + HColumnDescriptor hcs = new HColumnDescriptor("cf".getBytes()); + hds.addFamily(hcs); + admin.createTable(hds); + HRegionServer server = TEST_UTIL.getHBaseCluster().getRegionServer(0); + ServerName serverName = server.getServerName(); + HRegionInfo region = admin.getTableRegions(TableName.valueOf(TABLENAME)).get(0); + //move the region to the first server so we can abort this rs + admin.move(region.getEncodedNameAsBytes(), Bytes.toBytes(serverName.toString())); + TEST_UTIL.waitUntilAllRegionsAssigned(TableName.valueOf(TABLENAME)); + admin.disableTable(TABLENAME); + server.abort("abort"); + //wait for SSH to handle server shutdown + Thread.sleep(5000); + //trigger a clean of processedServers + TEST_UTIL.getHBaseCluster().getMaster().getAssignmentManager() + .getRegionStates().logSplit(ServerName.valueOf("fakeServer", 5000, 0)); + admin.enableTable(TABLENAME); + TEST_UTIL.waitUntilAllRegionsAssigned(TableName.valueOf(TABLENAME), 10000); + } }