You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zg...@apache.org on 2018/05/24 03:44:32 UTC
hbase git commit: HBASE-20589 Don't need to assign meta to a new RS
when standby master become active
Repository: hbase
Updated Branches:
refs/heads/master ee540c9f9 -> 320a3332e
HBASE-20589 Don't need to assign meta to a new RS when standby master become active
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/320a3332
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/320a3332
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/320a3332
Branch: refs/heads/master
Commit: 320a3332e064cd8c214d95652b59e95774fdf5ae
Parents: ee540c9
Author: Guanghao Zhang <zg...@apache.org>
Authored: Wed May 16 11:42:34 2018 +0800
Committer: Guanghao Zhang <zg...@apache.org>
Committed: Thu May 24 11:26:48 2018 +0800
----------------------------------------------------------------------
.../org/apache/hadoop/hbase/ServerName.java | 4 +
.../hbase/master/balancer/BaseLoadBalancer.java | 6 +-
.../hbase/regionserver/HRegionServer.java | 7 +-
.../org/apache/hadoop/hbase/TestServerName.java | 19 +++--
.../TestMetaAssignmentWithStopMaster.java | 86 ++++++++++++++++++++
5 files changed, 107 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/320a3332/hbase-common/src/main/java/org/apache/hadoop/hbase/ServerName.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/ServerName.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/ServerName.java
index 7a32b44..f79b17a 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/ServerName.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/ServerName.java
@@ -233,6 +233,10 @@ public class ServerName implements Comparable<ServerName>, Serializable {
return this.address.getHostname();
}
+ public String getHostnameLowerCase() {
+ return this.address.getHostname().toLowerCase(Locale.ROOT);
+ }
+
public int getPort() {
return this.address.getPort();
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/320a3332/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java
index 90f4e58..5f597dd 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java
@@ -1405,7 +1405,7 @@ public abstract class BaseLoadBalancer implements LoadBalancer {
ArrayListMultimap<String, ServerName> serversByHostname = ArrayListMultimap.create();
for (ServerName server : servers) {
assignments.put(server, new ArrayList<>());
- serversByHostname.put(server.getHostname(), server);
+ serversByHostname.put(server.getHostnameLowerCase(), server);
}
// Collection of the hostnames that used to have regions
@@ -1426,13 +1426,13 @@ public abstract class BaseLoadBalancer implements LoadBalancer {
ServerName oldServerName = entry.getValue();
List<ServerName> localServers = new ArrayList<>();
if (oldServerName != null) {
- localServers = serversByHostname.get(oldServerName.getHostname());
+ localServers = serversByHostname.get(oldServerName.getHostnameLowerCase());
}
if (localServers.isEmpty()) {
// No servers on the new cluster match up with this hostname, assign randomly, later.
randomAssignRegions.add(region);
if (oldServerName != null) {
- oldHostsNoLongerPresent.add(oldServerName.getHostname());
+ oldHostsNoLongerPresent.add(oldServerName.getHostnameLowerCase());
}
} else if (localServers.size() == 1) {
// the usual case - one new server on same host
http://git-wip-us.apache.org/repos/asf/hbase/blob/320a3332/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
index 188aef6..a17b402 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
@@ -1191,8 +1191,7 @@ public class HRegionServer extends HasThread implements
ClusterStatusProtos.ServerLoad sl = buildServerLoad(reportStartTime, reportEndTime);
try {
RegionServerReportRequest.Builder request = RegionServerReportRequest.newBuilder();
- ServerName sn = ServerName.parseVersionedServerName(this.serverName.getVersionedBytes());
- request.setServer(ProtobufUtil.toServerName(sn));
+ request.setServer(ProtobufUtil.toServerName(this.serverName));
request.setLoad(sl);
rss.regionServerReport(null, request.build());
} catch (ServiceException se) {
@@ -2378,9 +2377,7 @@ public class HRegionServer extends HasThread implements
if (rssStub != null && this.serverName != null) {
ReportRSFatalErrorRequest.Builder builder =
ReportRSFatalErrorRequest.newBuilder();
- ServerName sn =
- ServerName.parseVersionedServerName(this.serverName.getVersionedBytes());
- builder.setServer(ProtobufUtil.toServerName(sn));
+ builder.setServer(ProtobufUtil.toServerName(this.serverName));
builder.setErrorMessage(msg);
rssStub.reportRSFatalError(null, builder.build());
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/320a3332/hbase-server/src/test/java/org/apache/hadoop/hbase/TestServerName.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestServerName.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestServerName.java
index 2fdf542..6ed7c6b 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestServerName.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestServerName.java
@@ -87,16 +87,21 @@ public class TestServerName {
}
@Test public void testParseOfBytes() {
- final String snStr = "www.example.org,1234,5678";
+ final String snStr = "www.EXAMPLE.org,1234,5678";
ServerName sn = ServerName.valueOf(snStr);
byte [] versionedBytes = sn.getVersionedBytes();
- assertEquals(sn.toString(), ServerName.parseVersionedServerName(versionedBytes).toString());
- final String hostnamePortStr = sn.getHostAndPort();
+ ServerName parsedSn = ServerName.parseVersionedServerName(versionedBytes);
+ assertEquals(sn.toString(), parsedSn.toString());
+ assertEquals(sn.getHostnameLowerCase(), parsedSn.getHostnameLowerCase());
+ assertEquals(sn.getPort(), parsedSn.getPort());
+ assertEquals(sn.getStartcode(), parsedSn.getStartcode());
+
+ final String hostnamePortStr = sn.getAddress().toString();
byte [] bytes = Bytes.toBytes(hostnamePortStr);
- String expecting =
- hostnamePortStr.replace(":", ServerName.SERVERNAME_SEPARATOR) +
- ServerName.SERVERNAME_SEPARATOR + ServerName.NON_STARTCODE;
- assertEquals(expecting, ServerName.parseVersionedServerName(bytes).toString());
+ parsedSn = ServerName.parseVersionedServerName(bytes);
+ assertEquals(sn.getHostnameLowerCase(), parsedSn.getHostnameLowerCase());
+ assertEquals(sn.getPort(), parsedSn.getPort());
+ assertEquals(ServerName.NON_STARTCODE, parsedSn.getStartcode());
}
@Test
http://git-wip-us.apache.org/repos/asf/hbase/blob/320a3332/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMetaAssignmentWithStopMaster.java
----------------------------------------------------------------------
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..b087890
--- /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 static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+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;
+
+@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));
+ }
+}