Repository: hbase
Updated Branches:
  refs/heads/master 51f7b75f1 -> 1bc996aa5


HBASE-20049 Region replicas of SPLIT and MERGED regions are kept in in-memory 
states until restarting master

Signed-off-by: tedyu <yuzhih...@gmail.com>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/1bc996aa
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/1bc996aa
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/1bc996aa

Branch: refs/heads/master
Commit: 1bc996aa505e4a064a5bdf6abd56f77591643072
Parents: 51f7b75
Author: Toshihiro Suzuki <brfrn...@gmail.com>
Authored: Thu Feb 22 17:45:51 2018 +0900
Committer: tedyu <yuzhih...@gmail.com>
Committed: Thu Feb 22 20:06:21 2018 -0800

----------------------------------------------------------------------
 .../src/main/protobuf/MasterProcedure.proto     |  3 +-
 .../master/assignment/AssignmentManager.java    | 10 ++++-
 .../assignment/MergeTableRegionsProcedure.java  |  3 +-
 .../assignment/SplitTableRegionProcedure.java   |  3 +-
 .../master/assignment/UnassignProcedure.java    | 39 ++++++++++++++++++--
 5 files changed, 49 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/1bc996aa/hbase-protocol-shaded/src/main/protobuf/MasterProcedure.proto
----------------------------------------------------------------------
diff --git a/hbase-protocol-shaded/src/main/protobuf/MasterProcedure.proto 
b/hbase-protocol-shaded/src/main/protobuf/MasterProcedure.proto
index 83099c3..1ab51e5 100644
--- a/hbase-protocol-shaded/src/main/protobuf/MasterProcedure.proto
+++ b/hbase-protocol-shaded/src/main/protobuf/MasterProcedure.proto
@@ -331,6 +331,7 @@ message UnassignRegionStateData {
   // server we will send the unassign rpc too.
   optional ServerName hosting_server = 5;
   optional bool force = 4 [default = false];
+  optional bool remove_after_unassigning = 6 [default = false];
 }
 
 enum MoveRegionState {
@@ -409,4 +410,4 @@ message AddPeerStateData {
 
 message UpdatePeerConfigStateData {
   required ReplicationPeer peer_config = 1;
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/hbase/blob/1bc996aa/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
index 97d8258..ff65f46 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
@@ -733,11 +733,17 @@ public class AssignmentManager implements ServerListener {
 
   UnassignProcedure createUnassignProcedure(final RegionInfo regionInfo,
       final ServerName destinationServer, final boolean force) {
+    return createUnassignProcedure(regionInfo, destinationServer, force, 
false);
+  }
+
+  UnassignProcedure createUnassignProcedure(final RegionInfo regionInfo,
+      final ServerName destinationServer, final boolean force,
+      final boolean removeAfterUnassigning) {
     // If destinationServer is null, figure it.
     ServerName sn = destinationServer != null? destinationServer:
-      getRegionStates().getRegionState(regionInfo).getServerName();
+        getRegionStates().getRegionState(regionInfo).getServerName();
     assert sn != null;
-    UnassignProcedure proc = new UnassignProcedure(regionInfo, sn, force);
+    UnassignProcedure proc = new UnassignProcedure(regionInfo, sn, force, 
removeAfterUnassigning);
     proc.setOwner(getProcedureEnvironment().getRequestUser().getShortName());
     return proc;
   }

http://git-wip-us.apache.org/repos/asf/hbase/blob/1bc996aa/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.java
index c65dbe5..1c448dc 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.java
@@ -682,7 +682,8 @@ public class MergeTableRegionsProcedure
     for (int i = 0; i < regionsToMerge.length; ++i) {
       for (int j = 0; j < regionReplication; ++j) {
         final RegionInfo hri = 
RegionReplicaUtil.getRegionInfoForReplica(regionsToMerge[i], j);
-        procs[procsIdx++] = 
env.getAssignmentManager().createUnassignProcedure(hri,null,true);
+        procs[procsIdx++] = env.getAssignmentManager().
+            createUnassignProcedure(hri, null, true, 
!RegionReplicaUtil.isDefaultReplica(hri));
       }
     }
     return procs;

http://git-wip-us.apache.org/repos/asf/hbase/blob/1bc996aa/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java
index f7f49bc..46ec149 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java
@@ -793,7 +793,8 @@ public class SplitTableRegionProcedure
     final UnassignProcedure[] procs = new UnassignProcedure[regionReplication];
     for (int i = 0; i < procs.length; ++i) {
       final RegionInfo hri = 
RegionReplicaUtil.getRegionInfoForReplica(getParentRegion(), i);
-      procs[i] = env.getAssignmentManager().createUnassignProcedure(hri, null, 
true);
+      procs[i] = env.getAssignmentManager().
+          createUnassignProcedure(hri, null, true, 
!RegionReplicaUtil.isDefaultReplica(hri));
     }
     return procs;
   }

http://git-wip-us.apache.org/repos/asf/hbase/blob/1bc996aa/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/UnassignProcedure.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/UnassignProcedure.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/UnassignProcedure.java
index 8536e77..3454d96 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/UnassignProcedure.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/UnassignProcedure.java
@@ -26,6 +26,7 @@ import org.apache.hadoop.hbase.NotServingRegionException;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.client.RegionInfo;
 import org.apache.hadoop.hbase.exceptions.UnexpectedStateException;
+import org.apache.hadoop.hbase.favored.FavoredNodesManager;
 import org.apache.hadoop.hbase.ipc.ServerNotRunningYetException;
 import org.apache.hadoop.hbase.master.RegionState.State;
 import org.apache.hadoop.hbase.master.assignment.RegionStates.RegionStateNode;
@@ -40,6 +41,7 @@ import 
org.apache.hadoop.hbase.regionserver.RegionServerStoppedException;
 import org.apache.yetus.audience.InterfaceAudience;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.apache.hbase.thirdparty.com.google.common.collect.Lists;
 import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
 import 
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionTransitionState;
 import 
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.UnassignRegionStateData;
@@ -86,22 +88,34 @@ public class UnassignProcedure extends 
RegionTransitionProcedure {
   //       ...and keep unassign for 'disable' case?
   private boolean force;
 
+  /**
+   * Whether deleting the region from in-memory states after unassigning the 
region.
+   */
+  private boolean removeAfterUnassigning;
+
   public UnassignProcedure() {
     // Required by the Procedure framework to create the procedure on replay
     super();
   }
 
-  public UnassignProcedure(final RegionInfo regionInfo,  final ServerName 
hostingServer,
-                           final boolean force) {
-    this(regionInfo, hostingServer, null, force);
+  public UnassignProcedure(final RegionInfo regionInfo, final ServerName 
hostingServer,
+      final boolean force, final boolean removeAfterUnassigning) {
+    this(regionInfo, hostingServer, null, force, removeAfterUnassigning);
   }
 
   public UnassignProcedure(final RegionInfo regionInfo,
       final ServerName hostingServer, final ServerName destinationServer, 
final boolean force) {
+    this(regionInfo, hostingServer, destinationServer, force, false);
+  }
+
+  public UnassignProcedure(final RegionInfo regionInfo, final ServerName 
hostingServer,
+      final ServerName destinationServer, final boolean force,
+      final boolean removeAfterUnassigning) {
     super(regionInfo);
     this.hostingServer = hostingServer;
     this.destinationServer = destinationServer;
     this.force = force;
+    this.removeAfterUnassigning = removeAfterUnassigning;
 
     // we don't need REGION_TRANSITION_QUEUE, we jump directly to sending the 
request
     setTransitionState(RegionTransitionState.REGION_TRANSITION_DISPATCH);
@@ -136,6 +150,9 @@ public class UnassignProcedure extends 
RegionTransitionProcedure {
     if (force) {
       state.setForce(true);
     }
+    if (removeAfterUnassigning) {
+      state.setRemoveAfterUnassigning(true);
+    }
     serializer.serialize(state.build());
   }
 
@@ -151,6 +168,7 @@ public class UnassignProcedure extends 
RegionTransitionProcedure {
     if (state.hasDestinationServer()) {
       this.destinationServer = 
ProtobufUtil.toServerName(state.getDestinationServer());
     }
+    removeAfterUnassigning = state.getRemoveAfterUnassigning();
   }
 
   @Override
@@ -190,7 +208,20 @@ public class UnassignProcedure extends 
RegionTransitionProcedure {
   @Override
   protected void finishTransition(final MasterProcedureEnv env, final 
RegionStateNode regionNode)
       throws IOException {
-    env.getAssignmentManager().markRegionAsClosed(regionNode);
+    AssignmentManager am = env.getAssignmentManager();
+    RegionInfo regionInfo = getRegionInfo();
+
+    if (!removeAfterUnassigning) {
+      am.markRegionAsClosed(regionNode);
+    } else {
+      // Remove from in-memory states
+      am.getRegionStates().deleteRegion(regionInfo);
+      env.getMasterServices().getServerManager().removeRegion(regionInfo);
+      FavoredNodesManager fnm = 
env.getMasterServices().getFavoredNodesManager();
+      if (fnm != null) {
+        fnm.deleteFavoredNodesForRegions(Lists.newArrayList(regionInfo));
+      }
+    }
   }
 
   @Override

Reply via email to