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 3e895b4..9ecc051 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 @@ -2893,6 +2893,12 @@ public class AssignmentManager extends ZooKeeperListener { } ServerName lastHost = hrl.getServerName(); ServerName regionLocation = RegionStateStore.getRegionServer(result, replicaId); + if (tableStateManager.isTableState(regionInfo.getTable(), ZooKeeperProtos.Table.State.DISABLED)) { + // force region to forget it hosts for disabled/disabling tables. + // see HBASE-13326 + lastHost = null; + regionLocation = null; + } regionStates.createRegionState(regionInfo, state, regionLocation, lastHost); if (!regionStates.isRegionInState(regionInfo, State.OPEN)) { // Region is not open (either offline or in transition), skip diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/handler/TestEnableTableHandler.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/handler/TestEnableTableHandler.java index 87b6e9b..1e95b81 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/handler/TestEnableTableHandler.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/handler/TestEnableTableHandler.java @@ -66,7 +66,7 @@ public class TestEnableTableHandler { TEST_UTIL.getConfiguration().set("hbase.balancer.tablesOnMaster", "hbase:meta"); TEST_UTIL.getConfiguration().set(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY, MasterSyncObserver.class.getName()); - TEST_UTIL.startMiniCluster(1); + TEST_UTIL.startMiniCluster(1, 2); } @After @@ -112,6 +112,27 @@ public class TestEnableTableHandler { assertEquals(tableName, onlineRegions.get(1).getTable()); } + + @Test(timeout = 300000) + public void testDisableTableAndRestart() throws Exception { + final TableName tableName = TableName.valueOf("testDisableTableAndRestart"); + final MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster(); + final HBaseAdmin admin = TEST_UTIL.getHBaseAdmin(); + final HTableDescriptor desc = new HTableDescriptor(tableName); + desc.addFamily(new HColumnDescriptor(FAMILYNAME)); + admin.createTable(desc); + admin.disableTable(tableName); + TEST_UTIL.waitTableDisabled(tableName.getName()); + + TEST_UTIL.getHBaseCluster().shutdown(); + TEST_UTIL.getHBaseCluster().waitUntilShutDown(); + + TEST_UTIL.restartHBaseCluster(1); + + admin.enableTable(tableName); + TEST_UTIL.waitTableEnabled(tableName); + } + /** * We were only clearing rows that had a hregioninfo column in hbase:meta. Mangled rows that * were missing the hregioninfo because of error were being left behind messing up any