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)

Reply via email to