Repository: hbase Updated Branches: refs/heads/branch-1.2 39d344fe7 -> b8822633b
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/b8822633 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/b8822633 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/b8822633 Branch: refs/heads/branch-1.2 Commit: b8822633b674fccb0a60d14b2b07937fb7a358e4 Parents: 39d344f 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:09:49 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/b8822633/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 dc9c585..29eacf0 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/b8822633/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 ee2cfb6..c209d35 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 @@ -377,6 +377,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/b8822633/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);
