@@ -398,6 +398,11 @@ public void reportTransition(MasterProcedureEnv env, RegionStateNode regionNode,
398398 // Should be called with RegionStateNode locked
399399 public void serverCrashed (MasterProcedureEnv env , RegionStateNode regionNode ,
400400 ServerName serverName ) throws IOException {
401+ // force to assign to a new candidate server
402+ // TODO: the forceNewPlan flag not be persistent so if master crash then the flag will be lost.
403+ // But assign to old server is not big deal because it not effect correctness.
404+ // See HBASE-23035 for more details.
405+ forceNewPlan = true ;
401406 if (remoteProc != null ) {
402407 // this means we are waiting for the sub procedure, so wake it up
403408 remoteProc .serverCrashed (env , regionNode , serverName );
@@ -545,8 +550,13 @@ public enum TransitionType {
545550 // anything. See the comment in executeFromState to find out why we need this assumption.
546551 public static TransitRegionStateProcedure assign (MasterProcedureEnv env , RegionInfo region ,
547552 @ Nullable ServerName targetServer ) {
548- return setOwner (env ,
549- new TransitRegionStateProcedure (env , region , targetServer , false , TransitionType .ASSIGN ));
553+ return assign (env , region , false , targetServer );
554+ }
555+
556+ public static TransitRegionStateProcedure assign (MasterProcedureEnv env , RegionInfo region ,
557+ boolean forceNewPlan , @ Nullable ServerName targetServer ) {
558+ return setOwner (env , new TransitRegionStateProcedure (env , region , targetServer , forceNewPlan ,
559+ TransitionType .ASSIGN ));
550560 }
551561
552562 public static TransitRegionStateProcedure unassign (MasterProcedureEnv env , RegionInfo region ) {
0 commit comments