From c56ba389765c26f774288fc1a82e8245b7352ff6 Mon Sep 17 00:00:00 2001 From: Pankaj Kumar Date: Thu, 13 Oct 2016 20:31:50 +0800 Subject: [PATCH] HBASE-16807, RegionServer will fail to report new active Hmaster until HMaster/RegionServer failover. --- .../hadoop/hbase/regionserver/HRegionServer.java | 18 +++++++++++++++--- .../regionserver/TestRegionServerReportForDuty.java | 4 ++-- 2 files changed, 17 insertions(+), 5 deletions(-) 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 9897b29..49dde01 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 @@ -1185,7 +1185,7 @@ public class HRegionServer extends HasThread implements } // Couldn't connect to the master, get location from zk and reconnect // Method blocks until new master is found or we are stopped - createRegionServerStatusStub(); + createRegionServerStatusStub(true); } } @@ -2217,12 +2217,24 @@ public class HRegionServer extends HasThread implements */ @VisibleForTesting protected synchronized ServerName createRegionServerStatusStub() { + // Create RS stub without refreshing the master node from ZK, use cached data + return createRegionServerStatusStub(false); + } + + /** + * Get the current master from ZooKeeper and open the RPC connection to it. To get a fresh + * connection, the current rssStub must be null. Method will block until a master is available. + * You can break from this block by requesting the server stop. + * @param refresh If true then master address will be read from ZK, otherwise use cached data + * @return master + port, or null if server has been stopped + */ + @VisibleForTesting + protected synchronized ServerName createRegionServerStatusStub(boolean refresh) { if (rssStub != null) { return masterAddressTracker.getMasterAddress(); } ServerName sn = null; long previousLogTime = 0; - boolean refresh = false; // for the first time, use cached data RegionServerStatusService.BlockingInterface intf = null; boolean interrupted = false; try { @@ -2297,7 +2309,7 @@ public class HRegionServer extends HasThread implements * @throws IOException */ private RegionServerStartupResponse reportForDuty() throws IOException { - ServerName masterServerName = createRegionServerStatusStub(); + ServerName masterServerName = createRegionServerStatusStub(true); if (masterServerName == null) return null; RegionServerStartupResponse result = null; try { diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerReportForDuty.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerReportForDuty.java index 5778c6c..77cb5b7 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerReportForDuty.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerReportForDuty.java @@ -166,8 +166,8 @@ public class TestRegionServerReportForDuty { } @Override - protected synchronized ServerName createRegionServerStatusStub() { - sn = super.createRegionServerStatusStub(); + protected synchronized ServerName createRegionServerStatusStub(boolean refresh) { + sn = super.createRegionServerStatusStub(refresh); rpcStubCreatedFlag = true; // Wait for master switch over. Only do this for the second region server. -- 2.7.2.windows.1