diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index 90e0804..9ed115f 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ 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); diff --git hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMetaWithReplicas.java hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMetaWithReplicas.java index 4907d3d..67346c9 100644 --- hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMetaWithReplicas.java +++ 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; @@ -412,4 +410,32 @@ public class TestMetaWithReplicas { hbck = doFsck(TEST_UTIL.getConfiguration(), false); assertErrors(hbck, new ERROR_CODE[]{}); } + + @Test (timeout=360000) + 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(); + + ServerName masterSN = TEST_UTIL.getHBaseClusterInterface().getClusterStatus().getMaster(); + TEST_UTIL.getHBaseClusterInterface().stopMaster(masterSN); + TEST_UTIL.getHBaseClusterInterface().waitForMasterToStop(masterSN, 60000); + + TEST_UTIL.getHBaseClusterInterface().startMaster(masterSN.getHostname(), 0); + TEST_UTIL.getHBaseClusterInterface().waitForActiveAndReadyMaster(); + rl = c.locateRegion(TableName.META_TABLE_NAME, HConstants.EMPTY_START_ROW, false, true); + + TEST_UTIL.getHBaseClusterInterface().killRegionServer(meta0SN); + TEST_UTIL.getHBaseClusterInterface().waitForRegionServerToStop(meta0SN, 60000); + + TEST_UTIL.getMiniHBaseCluster().getMaster().getAssignmentManager().waitForAssignment( + HRegionInfo.FIRST_META_REGIONINFO); + + rl = c.locateRegion(TableName.META_TABLE_NAME, HConstants.EMPTY_START_ROW, false, true); + ServerName newMeta0SN = rl.getRegionLocation(0).getServerName(); + + assert (!meta0SN.equals(newMeta0SN)); + } }