@@ -292,6 +292,7 @@ protected void rollbackState(final MasterProcedureEnv env, final MergeTableRegio
292292 postRollBackMergeRegions (env );
293293 break ;
294294 case MERGE_TABLE_REGIONS_PREPARE :
295+ rollbackPrepareMerge (env );
295296 break ;
296297 default :
297298 throw new UnsupportedOperationException (this + " unhandled state=" + state );
@@ -514,6 +515,19 @@ private boolean isMergeable(final MasterProcedureEnv env, final RegionState rs)
514515 return response .hasMergeable () && response .getMergeable ();
515516 }
516517
518+ /**
519+ * Action for rollback a merge table after prepare merge
520+ */
521+ private void rollbackPrepareMerge (final MasterProcedureEnv env ) throws IOException {
522+ for (RegionInfo rinfo : regionsToMerge ) {
523+ RegionStateNode regionStateNode =
524+ env .getAssignmentManager ().getRegionStates ().getRegionStateNode (rinfo );
525+ if (regionStateNode .getState () == State .MERGING ) {
526+ regionStateNode .setState (State .OPEN );
527+ }
528+ }
529+ }
530+
517531 /**
518532 * Pre merge region action
519533 * @param env MasterProcedureEnv
@@ -639,8 +653,20 @@ private void cleanupMergedRegion(final MasterProcedureEnv env) throws IOExceptio
639653 * Rollback close regions
640654 **/
641655 private void rollbackCloseRegionsForMerge (MasterProcedureEnv env ) throws IOException {
642- AssignmentManagerUtil .reopenRegionsForRollback (env , Arrays .asList (regionsToMerge ),
643- getRegionReplication (env ), getServerName (env ));
656+ // At this point we should check if region was actually closed. If it was not closed then we
657+ // don't need to repoen the region and we can just change the regionNode state to OPEN.
658+ // if it is alredy closed then we need to do a reopen of region
659+ List <RegionInfo > toAssign = new ArrayList <>();
660+ for (RegionInfo rinfo : regionsToMerge ) {
661+ RegionStateNode regionStateNode =
662+ env .getAssignmentManager ().getRegionStates ().getRegionStateNode (rinfo );
663+ if (regionStateNode .getState () != State .MERGING ) {
664+ // same as before HBASE-28405
665+ toAssign .add (rinfo );
666+ }
667+ }
668+ AssignmentManagerUtil .reopenRegionsForRollback (env , toAssign , getRegionReplication (env ),
669+ getServerName (env ));
644670 }
645671
646672 private TransitRegionStateProcedure [] createUnassignProcedures (MasterProcedureEnv env )
0 commit comments