diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.java index 00ace72dbe..baff874471 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.java @@ -205,7 +205,7 @@ public abstract class RegionTransitionProcedure this.transitionState = state; } - RegionTransitionState getTransitionState() { + public RegionTransitionState getTransitionState() { return transitionState; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java index 6ec0079875..e8dd548c49 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java @@ -44,6 +44,7 @@ import org.slf4j.LoggerFactory; import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos; +import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionTransitionState; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ServerCrashState; /** @@ -419,13 +420,16 @@ public class ServerCrashProcedure if (sce == null) { sce = new ServerCrashException(getProcId(), getServerName()); } - rtp.remoteCallFailed(env, this.serverName, sce); - // If an assign, remove from passed-in list of regions so we subsequently do not create - // a new assign; the exisitng assign after the call to remoteCallFailed will recalibrate - // and assign to a server other than the crashed one; no need to create new assign. - // If an unassign, do not return this region; the above cancel will wake up the unassign and - // it will complete. Done. - it.remove(); + if (rtp.getTransitionState() != RegionTransitionState.REGION_TRANSITION_FINISH) { + // we can only interrupt the assign RTP if we are not in the REGION_TRANSITION_FINISH finish + rtp.remoteCallFailed(env, this.serverName, sce); + // If an assign, remove from passed-in list of regions so we subsequently do not create + // a new assign; the exisitng assign after the call to remoteCallFailed will recalibrate + // and assign to a server other than the crashed one; no need to create new assign. + // If an unassign, do not return this region; the above cancel will wake up the unassign and + // it will complete. Done. + it.remove(); + } } return toAssign; }