From 27398ea525be88f9d8089071e0d7f212f33c2ca8 Mon Sep 17 00:00:00 2001 From: Pankaj Kumar Date: Thu, 13 Oct 2016 20:19:07 +0800 Subject: [PATCH] HBASE-16807, RegionServer will fail to report new active Hmaster until HMaster/RegionServer failover. Signed-off-by: chenheng --- .../hbase/regionserver/HRegionServer.java | 18 +++++++++++++++--- .../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 03dcd4e74aa..f3eb27ff300 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 @@ -1196,7 +1196,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); } } @@ -2235,12 +2235,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 { @@ -2315,7 +2327,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 5778c6c09cd..77cb5b70314 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.