From f8f1fb20780cbeda569a3cefb8df190ea51f64f7 Mon Sep 17 00:00:00 2001 From: Guanghao Zhang Date: Fri, 8 Jun 2018 11:28:54 +0800 Subject: [PATCH] HBASE-20698 Master don't record right server version until new started region server call regionServerReport method --- .../hadoop/hbase/master/MasterRpcServices.java | 3 ++- .../hbase/master/assignment/AssignmentManager.java | 8 +++++++ .../hadoop/hbase/master/TestRestartCluster.java | 28 ++++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java index d3202ce..25fbb8a 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java @@ -484,7 +484,8 @@ public class MasterRpcServices extends RSRpcServices // if regionserver passed hostname to use, // then use it instead of doing a reverse DNS lookup ServerName rs = master.getServerManager().regionServerStartup(request, ia); - + int version = VersionInfoUtil.getCurrentClientVersionNumber(); + master.getAssignmentManager().recordServerNode(rs, version); // Send back some config info RegionServerStartupResponse.Builder resp = createConfigurationSubset(); NameStringPair.Builder entry = NameStringPair.newBuilder() 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 3c9b0d3..98f2b36 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 @@ -943,6 +943,14 @@ public class AssignmentManager implements ServerListener { } } + public void recordServerNode(ServerName serverName, int versionNumber) { + if (!isRunning()) { + return; + } + ServerStateNode serverNode = regionStates.getOrCreateServer(serverName); + serverNode.setVersionNumber(versionNumber); + } + // ============================================================================================ // RS Status update (report online regions) helpers // ============================================================================================ diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRestartCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRestartCluster.java index 088dff5..1e7ac45 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRestartCluster.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRestartCluster.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; +import java.io.IOException; import java.util.List; import java.util.Map; import org.apache.hadoop.hbase.HBaseClassTestRule; @@ -211,4 +212,31 @@ public class TestRestartCluster { assertNotEquals(oldServer.getStartcode(), currentServer.getStartcode()); } } + + @Test + public void testNewStartedRegionServerVersion() throws Exception { + UTIL.startMiniCluster(1); + + // Start 3 new region server + Thread t = new Thread(() -> { + for (int i = 0; i < 3; i++) { + try { + JVMClusterUtil.RegionServerThread newRS = UTIL.getMiniHBaseCluster().startRegionServer(); + newRS.waitForServerOnline(); + } catch (IOException e) { + LOG.error("Failed to start a new RS", e); + } + } + }); + t.start(); + + HMaster master = UTIL.getMiniHBaseCluster().getMaster(); + while (t.isAlive()) { + List serverNames = master.getServerManager().getOnlineServersList(); + for (ServerName serverName : serverNames) { + assertNotEquals(0, master.getAssignmentManager().getServerVersion(serverName)); + } + Thread.sleep(100); + } + } } -- 2.7.4