From 2dd34b3f0177864380e06b56a1b80fab340d5662 Mon Sep 17 00:00:00 2001 From: Duo Zhang Date: Tue, 9 Jun 2020 08:14:00 +0800 Subject: [PATCH] HBASE-24517 AssignmentManager.start should add meta region to ServerStateNode (#1866) Signed-off-by: Viraj Jasani Signed-off-by: Wellington Ramos Chevreuil --- .../master/assignment/AssignmentManager.java | 18 ++--- ...tAssignmentManagerLoadMetaRegionState.java | 76 +++++++++++++++++++ 2 files changed, 84 insertions(+), 10 deletions(-) create mode 100644 hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestAssignmentManagerLoadMetaRegionState.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java index f2a77ba361f..b17693bde06 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java @@ -231,17 +231,15 @@ public class AssignmentManager { RegionState regionState = MetaTableLocator.getMetaRegionState(zkw); RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(RegionInfoBuilder.FIRST_META_REGIONINFO); - regionNode.lock(); - try { - regionNode.setRegionLocation(regionState.getServerName()); - regionNode.setState(regionState.getState()); - if (regionNode.getProcedure() != null) { - regionNode.getProcedure().stateLoaded(this, regionNode); - } - setMetaAssigned(regionState.getRegion(), regionState.getState() == State.OPEN); - } finally { - regionNode.unlock(); + regionNode.setRegionLocation(regionState.getServerName()); + regionNode.setState(regionState.getState()); + if (regionNode.getProcedure() != null) { + regionNode.getProcedure().stateLoaded(this, regionNode); } + if (regionState.getServerName() != null) { + regionStates.addRegionToServer(regionNode); + } + setMetaAssigned(regionState.getRegion(), regionState.getState() == State.OPEN); } } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestAssignmentManagerLoadMetaRegionState.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestAssignmentManagerLoadMetaRegionState.java new file mode 100644 index 00000000000..959738b4758 --- /dev/null +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestAssignmentManagerLoadMetaRegionState.java @@ -0,0 +1,76 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hbase.master.assignment; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.hadoop.hbase.HBaseClassTestRule; +import org.apache.hadoop.hbase.HBaseTestingUtility; +import org.apache.hadoop.hbase.ServerName; +import org.apache.hadoop.hbase.client.RegionInfo; +import org.apache.hadoop.hbase.master.HMaster; +import org.apache.hadoop.hbase.testclassification.MasterTests; +import org.apache.hadoop.hbase.testclassification.MediumTests; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +@Category({ MasterTests.class, MediumTests.class }) +public class TestAssignmentManagerLoadMetaRegionState { + + @ClassRule + public static final HBaseClassTestRule CLASS_RULE = + HBaseClassTestRule.forClass(TestAssignmentManagerLoadMetaRegionState.class); + + private static final HBaseTestingUtility UTIL = new HBaseTestingUtility(); + + @BeforeClass + public static void setUp() throws Exception { + UTIL.startMiniCluster(1); + } + + @AfterClass + public static void tearDown() throws IOException { + UTIL.shutdownMiniCluster(); + } + + @Test + public void testRestart() throws InterruptedException, IOException { + ServerName sn = UTIL.getMiniHBaseCluster().getRegionServer(0).getServerName(); + AssignmentManager am = UTIL.getMiniHBaseCluster().getMaster().getAssignmentManager(); + Set regions = new HashSet<>(am.getRegionsOnServer(sn)); + + UTIL.getMiniHBaseCluster().stopMaster(0).join(); + HMaster newMaster = UTIL.getMiniHBaseCluster().startMaster().getMaster(); + UTIL.waitFor(30000, () -> newMaster.isInitialized()); + + am = UTIL.getMiniHBaseCluster().getMaster().getAssignmentManager(); + List newRegions = am.getRegionsOnServer(sn); + assertEquals(regions.size(), newRegions.size()); + for (RegionInfo region : newRegions) { + assertTrue(regions.contains(region)); + } + } +}