You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by sy...@apache.org on 2016/12/28 21:49:36 UTC

hbase git commit: HBASE-17238 Wrong in-memory hbase:meta location causing SSH failure (Stephen Yuan jiang)

Repository: hbase
Updated Branches:
  refs/heads/branch-1.1 1999c15a9 -> a1d900db4


HBASE-17238 Wrong in-memory hbase:meta location causing SSH failure (Stephen Yuan jiang)


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/a1d900db
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/a1d900db
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/a1d900db

Branch: refs/heads/branch-1.1
Commit: a1d900db44cf7834f714b2ad4720795ddbc45e12
Parents: 1999c15
Author: Stephen Yuan Jiang <sy...@gmail.com>
Authored: Wed Dec 28 13:49:16 2016 -0800
Committer: Stephen Yuan Jiang <sy...@gmail.com>
Committed: Wed Dec 28 13:49:16 2016 -0800

----------------------------------------------------------------------
 .../org/apache/hadoop/hbase/master/HMaster.java |  6 +-
 .../hbase/client/TestMetaWithReplicas.java      | 65 +++++++++++++++++++-
 2 files changed, 64 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/a1d900db/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
index 90e0804..9ed115f 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
@@ -938,10 +938,8 @@ public class HMaster extends HRegionServer implements MasterServices, Server {
       }
     } else {
       // Region already assigned. We didn't assign it. Add to in-memory state.
-      regionStates.updateRegionState(
-        HRegionInfo.FIRST_META_REGIONINFO, State.OPEN, currentMetaServer);
-      this.assignmentManager.regionOnline(
-        HRegionInfo.FIRST_META_REGIONINFO, currentMetaServer);
+      regionStates.updateRegionState(hri, State.OPEN, currentMetaServer);
+      this.assignmentManager.regionOnline(hri, currentMetaServer);
     }
 
     if (replicaId == HRegionInfo.DEFAULT_REPLICA_ID) enableMeta(TableName.META_TABLE_NAME);

http://git-wip-us.apache.org/repos/asf/hbase/blob/a1d900db/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMetaWithReplicas.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMetaWithReplicas.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMetaWithReplicas.java
index 4907d3d..477d10a 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMetaWithReplicas.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMetaWithReplicas.java
@@ -18,7 +18,6 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import java.io.IOException;
 import static org.apache.hadoop.hbase.util.hbck.HbckTestingUtil.assertErrors;
 import static org.apache.hadoop.hbase.util.hbck.HbckTestingUtil.doFsck;
 import static org.junit.Assert.*;
@@ -41,7 +40,6 @@ import org.apache.hadoop.hbase.RegionLocations;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.TableNotFoundException;
-import org.apache.hadoop.hbase.Waiter;
 import org.apache.hadoop.hbase.client.ConnectionManager.HConnectionImplementation;
 import org.apache.hadoop.hbase.regionserver.StorefileRefresherChore;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
@@ -72,7 +70,8 @@ public class TestMetaWithReplicas {
     TEST_UTIL.getConfiguration().setInt(HConstants.META_REPLICAS_NUM, 3);
     TEST_UTIL.getConfiguration().setInt(
         StorefileRefresherChore.REGIONSERVER_STOREFILE_REFRESH_PERIOD, 1000);
-    TEST_UTIL.startMiniCluster(3);
+    TEST_UTIL.getConfiguration().setInt("hbase.master.wait.on.regionservers.mintostart", 3);
+    TEST_UTIL.startMiniCluster(4);
     // disable the balancer
     LoadBalancerTracker l = new LoadBalancerTracker(TEST_UTIL.getZooKeeperWatcher(),
         new Abortable() {
@@ -412,4 +411,64 @@ public class TestMetaWithReplicas {
     hbck = doFsck(TEST_UTIL.getConfiguration(), false);
     assertErrors(hbck, new ERROR_CODE[]{});
   }
+
+  @Test (timeout=180000)
+  public void testMetaTableReplicaAssignment() throws Exception {
+    ClusterConnection c = ConnectionManager.getConnectionInternal(TEST_UTIL.getConfiguration());
+    RegionLocations rl =
+        c.locateRegion(TableName.META_TABLE_NAME, HConstants.EMPTY_START_ROW, false, true);
+
+    ServerName meta0SN = rl.getRegionLocation(0).getServerName();
+    LOG.debug("The hbase:meta default replica region is in server: " + meta0SN);
+    ServerName meta1SN = rl.getRegionLocation(1).getServerName();
+    LOG.debug("The hbase:meta replica 1 region " + rl.getRegionLocation(1).getRegionInfo() +
+      " is in server: " + meta1SN);
+
+    LOG.debug("Killing the region server " + meta1SN +
+      " that hosts hbase:meta replica 1 region " + rl.getRegionLocation(1).getRegionInfo());
+    TEST_UTIL.getHBaseClusterInterface().killRegionServer(meta1SN);
+    TEST_UTIL.getHBaseClusterInterface().waitForRegionServerToStop(meta1SN, 60000);
+
+    ServerName masterSN = TEST_UTIL.getHBaseClusterInterface().getClusterStatus().getMaster();
+    LOG.debug("Killing the master server " + masterSN);
+    TEST_UTIL.getHBaseClusterInterface().stopMaster(masterSN);
+    TEST_UTIL.getHBaseClusterInterface().waitForMasterToStop(masterSN, 60000);
+    LOG.debug("Restarting the master server " + masterSN);
+    TEST_UTIL.getHBaseClusterInterface().startMaster(masterSN.getHostname(), masterSN.getPort());
+    TEST_UTIL.getHBaseClusterInterface().waitForActiveAndReadyMaster();
+    rl = c.locateRegion(TableName.META_TABLE_NAME, HConstants.EMPTY_START_ROW, false, true);
+
+    // wait for replica 1 to be re-assigned
+    ServerName newMeta1SN;
+    int i = 0;
+    do {
+      Thread.sleep(100);
+      newMeta1SN = rl.getRegionLocation(1).getServerName();
+      i++;
+    } while (meta1SN.equals(newMeta1SN) & i < 600); // wait for 60 seconds
+    LOG.debug("The hbase:meta replica 1 region " + rl.getRegionLocation(1).getRegionInfo() +
+        " is now moved from server " + meta1SN + " to server " + newMeta1SN);
+    assert (!meta1SN.equals(newMeta1SN));
+
+    LOG.debug("Killing the region server " + meta0SN +
+      " that hosts hbase:meta default replica region " + rl.getRegionLocation(0).getRegionInfo());
+    TEST_UTIL.getHBaseClusterInterface().killRegionServer(meta0SN);
+    TEST_UTIL.getHBaseClusterInterface().waitForRegionServerToStop(meta0SN, 60000);
+
+    TEST_UTIL.getMiniHBaseCluster().getMaster().getAssignmentManager().waitForAssignment(
+      HRegionInfo.FIRST_META_REGIONINFO);
+
+    // wait for default replica to be re-assigned
+    ServerName newMeta0SN;
+    i = 0;
+    do {
+      Thread.sleep(100);
+      rl = c.locateRegion(TableName.META_TABLE_NAME, HConstants.EMPTY_START_ROW, false, true);
+      newMeta0SN = rl.getRegionLocation(0).getServerName();
+      i++;
+    } while (meta0SN.equals(newMeta0SN) && i < 600); // wait for 60 seconds
+    LOG.debug("The hbase:meta default replica region is now moved from server " +
+      meta0SN + " to server " + newMeta0SN);
+    assert (!meta0SN.equals(newMeta0SN));
+  }
 }