Repository: hbase Updated Branches: refs/heads/branch-1.1 637fbb496 -> 4348dd602
HBASE-17264 Processing RIT with offline state will always fail to open the first time (Allan Yang) Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/4348dd60 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/4348dd60 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/4348dd60 Branch: refs/heads/branch-1.1 Commit: 4348dd60202f1ec9bc319f71436debac0637ce48 Parents: 637fbb4 Author: tedyu <yuzhih...@gmail.com> Authored: Mon Feb 6 20:28:16 2017 -0800 Committer: tedyu <yuzhih...@gmail.com> Committed: Mon Feb 6 20:28:16 2017 -0800 ---------------------------------------------------------------------- .../hadoop/hbase/master/AssignmentManager.java | 7 ++--- .../hbase/master/TestAssignmentManager.java | 27 ++++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/4348dd60/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 0cbc005..18babe6 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 @@ -847,7 +847,7 @@ public class AssignmentManager extends ZooKeeperListener { case M_ZK_REGION_OFFLINE: // Insert in RIT and resend to the regionserver - regionStates.updateRegionState(rt, State.PENDING_OPEN); + regionStates.updateRegionState(rt, State.OFFLINE); final RegionState rsOffline = regionStates.getRegionState(regionInfo); this.executorService.submit( new EventHandler(server, EventType.M_MASTER_RECOVERY) { @@ -857,7 +857,7 @@ public class AssignmentManager extends ZooKeeperListener { try { RegionPlan plan = new RegionPlan(regionInfo, null, sn); addPlan(encodedName, plan); - assign(rsOffline, false, false); + assign(rsOffline, true, false); } finally { lock.unlock(); } @@ -1576,6 +1576,7 @@ public class AssignmentManager extends ZooKeeperListener { /** * Use care with forceNewPlan. It could cause double assignment. */ + @VisibleForTesting public void assign(HRegionInfo region, boolean setOfflineInZK, boolean forceNewPlan) { if (isDisabledorDisablingRegionInRIT(region)) { @@ -2053,7 +2054,7 @@ public class AssignmentManager extends ZooKeeperListener { * @param setOfflineInZK * @param forceNewPlan */ - private void assign(RegionState state, + public void assign(RegionState state, boolean setOfflineInZK, final boolean forceNewPlan) { long startTime = EnvironmentEdgeManager.currentTime(); try { http://git-wip-us.apache.org/repos/asf/hbase/blob/4348dd60/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManager.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManager.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManager.java index 0dd1ff2..d585756 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManager.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManager.java @@ -859,6 +859,7 @@ public class TestAssignmentManager { } } + /** * Mocked load balancer class used in the testcase to make sure that the testcase waits until * random assignment is called and the gate variable is set to true. @@ -929,6 +930,22 @@ public class TestAssignmentManager { am.shutdown(); } + @Test(timeout = 600000) + public void testAssignmentOfRegionRITWithOffline() throws IOException, + KeeperException, ServiceException, CoordinatedStateException, InterruptedException { + AssignmentManagerWithExtrasForTesting am = setUpMockedAssignmentManager( + this.server, this.serverManager); + ZKAssign.createNodeOffline(this.watcher, REGIONINFO, SERVERNAME_B); + am.gate.set(false); + // join the cluster - that's when the AM is really kicking in after a restart + am.joinCluster(); + while (!am.gate.get()) { + Thread.sleep(10); + } + assertTrue(am.getRegionStates().getRegionState(REGIONINFO).getState() + == RegionState.State.PENDING_OPEN); + am.shutdown(); + } /** * Test the scenario when the master is in failover and trying to process a * region which is in Opening state on a dead RS. Master will force offline the @@ -1341,6 +1358,16 @@ public class TestAssignmentManager { this.gate.set(true); } } + @Override + public void assign(RegionState state, + boolean setOfflineInZK, final boolean forceNewPlan) { + if (enabling) { + assignmentCount++; + } else { + super.assign(state, setOfflineInZK, forceNewPlan); + this.gate.set(true); + } + } @Override boolean assign(ServerName destination, List<HRegionInfo> regions)