From e51584381ab9e5571c788870f6766b7e7f9b5976 Mon Sep 17 00:00:00 2001 From: Stephen Yuan Jiang Date: Sat, 10 Dec 2016 15:05:00 -0800 Subject: [PATCH] HBASE-17023 Region left unassigned due to AM and SSH each thinking others would do the assignment work (Stephen Yuan Jiang) --- .../hbase/master/AssignmentManager.java | 3 +-- .../hadoop/hbase/master/RegionStates.java | 25 +++++++++++++++++++ .../master/handler/ClosedRegionHandler.java | 3 +-- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java index 502b63f4649..2035f6a5767 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java @@ -864,8 +864,7 @@ public class AssignmentManager extends ZooKeeperListener { case RS_ZK_REGION_CLOSED: case RS_ZK_REGION_FAILED_OPEN: // Region is closed, insert into RIT and handle it - regionStates.setLastRegionServerOfRegion(sn, encodedName); - regionStates.updateRegionState(regionInfo, State.CLOSED, sn); + regionStates.setRegionStateTOCLOSED(regionInfo, sn); if (!replicasToClose.contains(regionInfo)) { invokeAssign(regionInfo); } else { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java index d80784e7840..c2c45d23376 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java @@ -419,6 +419,31 @@ public class RegionStates { return oldState; } + /** + * Set the region state to CLOSED + */ + public RegionState setRegionStateTOCLOSED( + final HRegionInfo regionInfo, + final ServerName serverName) { + ServerName sn = serverName; + if (sn == null) { + RegionState regionState = getRegionState(regionInfo.getEncodedName()); + if (regionState != null) { + sn = regionState.getServerName(); + } + // TODO: if sn is null, should we dig into + // lastAssignments.get(regionInfo.getEncodedName() to get the server name? + // For now, I just keep the same logic that works in the past + } + // We have to make sure that the last region server is set to be the same as the + // current RS. If we don't do that, we could run into situation that both AM and SSH + // think other would do the assignment work; at the end, neither does the work and + // region remains RIT. + // See HBASE-13330 and HBASE-17023 + setLastRegionServerOfRegion(sn, regionInfo.getEncodedName()); + return updateRegionState(regionInfo, State.CLOSED, sn); + } + /** * Update a region state. It will be put in transition if not already there. */ diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ClosedRegionHandler.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ClosedRegionHandler.java index 277ad648a3f..389a738c7a2 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ClosedRegionHandler.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ClosedRegionHandler.java @@ -99,8 +99,7 @@ public class ClosedRegionHandler extends EventHandler implements TotesHRegionInf return; } // ZK Node is in CLOSED state, assign it. - assignmentManager.getRegionStates().updateRegionState( - regionInfo, RegionState.State.CLOSED); + assignmentManager.getRegionStates().setRegionStateTOCLOSED(regionInfo, null); // This below has to do w/ online enable/disable of a table assignmentManager.removeClosedRegion(regionInfo); assignmentManager.invokeAssign(regionInfo, false);