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));
+  }
+}