You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by jx...@apache.org on 2014/08/12 20:32:16 UTC
git commit: HBASE-11703 Meta region state could be corrupted
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 <jx...@cloudera.com>
Authored: Thu Aug 7 20:58:17 2014 -0700
Committer: Jimmy Xiang <jx...@cloudera.com>
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)