Repository: hbase Updated Branches: refs/heads/branch-1.1 baf940969 -> 273c228e6
HBASE-17023 Region left unassigned due to AM and SSH each thinking others would do the assignment work (Stephen Yuan Jiang) Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/273c228e Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/273c228e Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/273c228e Branch: refs/heads/branch-1.1 Commit: 273c228e634e13a4b6ee0da791936ca295bfa813 Parents: baf9409 Author: Stephen Yuan Jiang <[email protected]> Authored: Sat Dec 10 15:05:00 2016 -0800 Committer: Stephen Yuan Jiang <[email protected]> Committed: Sat Dec 10 15:12:05 2016 -0800 ---------------------------------------------------------------------- .../hadoop/hbase/master/AssignmentManager.java | 3 +-- .../hadoop/hbase/master/RegionStates.java | 25 ++++++++++++++++++++ .../master/handler/ClosedRegionHandler.java | 3 +-- 3 files changed, 27 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/273c228e/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java ---------------------------------------------------------------------- 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 d2e6d02..0cbc005 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 @@ -837,8 +837,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 { http://git-wip-us.apache.org/repos/asf/hbase/blob/273c228e/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java ---------------------------------------------------------------------- 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 42583ff..64b64c4 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 @@ -378,6 +378,31 @@ public class RegionStates { } /** + * 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. */ public RegionState updateRegionState( http://git-wip-us.apache.org/repos/asf/hbase/blob/273c228e/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ClosedRegionHandler.java ---------------------------------------------------------------------- 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 e0e4ee4..74b45bc 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.assign(regionInfo, true);
