You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by sy...@apache.org on 2016/12/10 23:06:48 UTC

hbase git commit: HBASE-17023 Region left unassigned due to AM and SSH each thinking others would do the assignment work (Stephen Yuan Jiang)

Repository: hbase
Updated Branches:
  refs/heads/branch-1 c2801a2ea -> e51584381


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/e5158438
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/e5158438
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/e5158438

Branch: refs/heads/branch-1
Commit: e51584381ab9e5571c788870f6766b7e7f9b5976
Parents: c2801a2
Author: Stephen Yuan Jiang <sy...@gmail.com>
Authored: Sat Dec 10 15:05:00 2016 -0800
Committer: Stephen Yuan Jiang <sy...@gmail.com>
Committed: Sat Dec 10 15:05:00 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/e5158438/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 502b63f..2035f6a 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 {

http://git-wip-us.apache.org/repos/asf/hbase/blob/e5158438/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 d80784e..c2c45d2 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
@@ -420,6 +420,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/e5158438/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 277ad64..389a738 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);