From d9820542e0ef68d60502fc94fa90a576d631c41c Mon Sep 17 00:00:00 2001 From: Guanghao Zhang Date: Wed, 16 May 2018 11:42:34 +0800 Subject: [PATCH] HBASE-20589 Don't need to assign meta to a new RS when standby master become active --- .../hbase/master/assignment/AssignProcedure.java | 1 + .../master/TestMetaAssignmentWithStopMaster.java | 86 ++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMetaAssignmentWithStopMaster.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignProcedure.java index 768f32b..300b512 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignProcedure.java @@ -158,6 +158,7 @@ public class AssignProcedure extends RegionTransitionProcedure { @Override protected boolean startTransition(final MasterProcedureEnv env, final RegionStateNode regionNode) throws IOException { + LOG.info("Region node is " + regionNode + ", isServerOnline? " + isServerOnline(env, regionNode)); // If the region is already open we can't do much... if (regionNode.isInState(State.OPEN) && isServerOnline(env, regionNode)) { LOG.info("Assigned, not reassigning; " + this + "; " + regionNode.toShortString()); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMetaAssignmentWithStopMaster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMetaAssignmentWithStopMaster.java new file mode 100644 index 0000000..9d3ec58 --- /dev/null +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMetaAssignmentWithStopMaster.java @@ -0,0 +1,86 @@ +/** + * 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; + +import org.apache.hadoop.hbase.HBaseClassTestRule; +import org.apache.hadoop.hbase.HBaseTestingUtility; +import org.apache.hadoop.hbase.ServerName; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.ClusterConnection; +import org.apache.hadoop.hbase.client.ConnectionFactory; +import org.apache.hadoop.hbase.testclassification.LargeTests; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +@Category({ LargeTests.class }) +public class TestMetaAssignmentWithStopMaster { + + private static final Logger LOG = + LoggerFactory.getLogger(TestMetaAssignmentWithStopMaster.class); + + @ClassRule + public static final HBaseClassTestRule CLASS_RULE = + HBaseClassTestRule.forClass(TestMetaAssignmentWithStopMaster.class); + + private static final HBaseTestingUtility UTIL = new HBaseTestingUtility(); + + private static final long WAIT_TIMEOUT = 120000; + + @BeforeClass + public static void setUp() throws Exception { + UTIL.startMiniCluster(2,3); + } + + @Test + public void testStopActiveMaster() throws Exception { + ClusterConnection conn = + (ClusterConnection) ConnectionFactory.createConnection(UTIL.getConfiguration()); + ServerName oldMetaServer = conn.locateRegions(TableName.META_TABLE_NAME).get(0).getServerName(); + ServerName oldMaster = UTIL.getMiniHBaseCluster().getMaster().getServerName(); + + UTIL.getMiniHBaseCluster().getMaster().stop("Stop master for test"); + long startTime = System.currentTimeMillis(); + while (UTIL.getMiniHBaseCluster().getMaster() == null || UTIL.getMiniHBaseCluster().getMaster() + .getServerName().equals(oldMaster)) { + LOG.info("Wait the standby master become active"); + Thread.sleep(3000); + if (System.currentTimeMillis() - startTime > WAIT_TIMEOUT) { + fail("Wait too long for standby master become active"); + } + } + startTime = System.currentTimeMillis(); + while (!UTIL.getMiniHBaseCluster().getMaster().isInitialized()) { + LOG.info("Wait the new active master to be initialized"); + Thread.sleep(3000); + if (System.currentTimeMillis() - startTime > WAIT_TIMEOUT) { + fail("Wait too long for the new active master to be initialized"); + } + } + + ServerName newMetaServer = conn.locateRegions(TableName.META_TABLE_NAME).get(0).getServerName(); + assertTrue("The new meta server " + newMetaServer + " should be same with" + + " the old meta server " + oldMetaServer, newMetaServer.equals(oldMetaServer)); + } +} -- 2.7.4