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)