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 98883c1..11a3780 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 @@ -2854,6 +2854,12 @@ public class AssignmentManager extends ZooKeeperListener { State state = RegionStateStore.getRegionState(result, replicaId); 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 39b347d..ba9213e 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 @@ -62,7 +62,7 @@ public class TestEnableTableHandler { @Before public void setUp() throws Exception { TEST_UTIL.getConfiguration().set("hbase.balancer.tablesOnMaster", "hbase:meta"); - TEST_UTIL.startMiniCluster(1); + TEST_UTIL.startMiniCluster(1, 2); } @After @@ -108,6 +108,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(2); + + 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