Repository: hbase Updated Branches: refs/heads/master 9abe2da9e -> 1262f1e2d
HBASE-11703 Meta region state could be corrupted Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/1262f1e2 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/1262f1e2 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/1262f1e2 Branch: refs/heads/master Commit: 1262f1e2d49c731eba866fc0382956bfe3dd33dc Parents: 9abe2da Author: Jimmy Xiang <[email protected]> Authored: Thu Aug 7 20:58:17 2014 -0700 Committer: Jimmy Xiang <[email protected]> Committed: Tue Aug 12 11:31:41 2014 -0700 ---------------------------------------------------------------------- .../hadoop/hbase/master/RegionStates.java | 2 +- .../master/handler/ServerShutdownHandler.java | 8 +--- .../master/TestAssignmentManagerOnCluster.java | 46 ++++++++++++++++++++ 3 files changed, 48 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/1262f1e2/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java index f111107..36bc8e2 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java @@ -508,7 +508,7 @@ public class RegionStates { ServerName oldServerName = regionAssignments.remove(hri); if (oldServerName != null && serverHoldings.containsKey(oldServerName) && (newState == State.MERGED || newState == State.SPLIT - || tableStateManager.isTableState(hri.getTable(), + || hri.isMetaRegion() || tableStateManager.isTableState(hri.getTable(), ZooKeeperProtos.Table.State.DISABLED, ZooKeeperProtos.Table.State.DISABLING))) { // Offline the region only if it's merged/split, or the table is disabled/disabling. // Otherwise, offline it from this server only when it is online on a different server. http://git-wip-us.apache.org/repos/asf/hbase/blob/1262f1e2/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java index 5d26ac8..f8674da 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java @@ -156,13 +156,7 @@ public class ServerShutdownHandler extends EventHandler { while (!this.server.isStopped()) { try { server.getMetaTableLocator().waitMetaRegionLocation(server.getZooKeeper()); - // Skip getting user regions if the server is stopped. - if (!this.server.isStopped()) { - hris = am.getRegionStates().getServerRegions(serverName); - if (hris != null) { - hris.remove(HRegionInfo.FIRST_META_REGIONINFO); - } - } + hris = am.getRegionStates().getServerRegions(serverName); break; } catch (InterruptedException e) { Thread.currentThread().interrupt(); http://git-wip-us.apache.org/repos/asf/hbase/blob/1262f1e2/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java index ff3a8d9..6b1cc23 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java @@ -19,6 +19,7 @@ package org.apache.hadoop.hbase.master; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -101,6 +102,51 @@ public class TestAssignmentManagerOnCluster { } /** + * This tests restarting meta regionserver + */ + @Test (timeout=180000) + public void testRestartMetaRegionServer() throws Exception { + MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster(); + boolean stoppedARegionServer = false; + try { + HMaster master = cluster.getMaster(); + RegionStates regionStates = master.getAssignmentManager().getRegionStates(); + ServerName metaServerName = regionStates.getRegionServerOfRegion( + HRegionInfo.FIRST_META_REGIONINFO); + if (master.getServerName().equals(metaServerName)) { + // Move meta off master + metaServerName = cluster.getLiveRegionServerThreads() + .get(0).getRegionServer().getServerName(); + master.move(HRegionInfo.FIRST_META_REGIONINFO.getEncodedNameAsBytes(), + Bytes.toBytes(metaServerName.getServerName())); + TEST_UTIL.waitUntilNoRegionsInTransition(60000); + } + assertNotEquals("Meta should be moved off master", + metaServerName, master.getServerName()); + cluster.killRegionServer(metaServerName); + stoppedARegionServer = true; + cluster.waitForRegionServerToStop(metaServerName, 60000); + + // Wait for SSH to finish + final ServerManager serverManager = master.getServerManager(); + TEST_UTIL.waitFor(120000, 200, new Waiter.Predicate<Exception>() { + @Override + public boolean evaluate() throws Exception { + return !serverManager.areDeadServersInProgress(); + } + }); + + // Now, make sure meta is assigned + assertTrue("Meta should be assigned", + regionStates.isRegionOnline(HRegionInfo.FIRST_META_REGIONINFO)); + } finally { + if (stoppedARegionServer) { + cluster.startRegionServer(); + } + } + } + + /** * This tests region assignment */ @Test (timeout=60000)
