Skip to content

Commit 53809ab

Browse files
mnpooniaApache9
andcommitted
HBASE-28405 Fix failed procedure rollback when region was not closed and is still in state merging (#5799)
Co-authored-by: Duo Zhang <[email protected]> Signed-off-by: Duo Zhang <[email protected]> Signed-off-by: Viraj Jasani <[email protected]> (cherry picked from commit ba09913)
1 parent 70e3682 commit 53809ab

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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)

hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.apache.hadoop.fs.Path;
3838
import org.apache.hadoop.hbase.Coprocessor;
3939
import org.apache.hadoop.hbase.CoprocessorEnvironment;
40+
import org.apache.hadoop.hbase.DoNotRetryIOException;
4041
import org.apache.hadoop.hbase.HBaseClassTestRule;
4142
import org.apache.hadoop.hbase.HBaseTestingUtility;
4243
import org.apache.hadoop.hbase.HColumnDescriptor;
@@ -52,7 +53,6 @@
5253
import org.apache.hadoop.hbase.client.CompactionState;
5354
import org.apache.hadoop.hbase.client.Connection;
5455
import org.apache.hadoop.hbase.client.ConnectionFactory;
55-
import org.apache.hadoop.hbase.client.DoNotRetryRegionException;
5656
import org.apache.hadoop.hbase.client.RegionInfo;
5757
import org.apache.hadoop.hbase.client.RegionLocator;
5858
import org.apache.hadoop.hbase.client.Table;
@@ -405,7 +405,7 @@ public boolean evaluate() throws Exception {
405405
try {
406406
ADMIN.split(tableTwo, Bytes.toBytes("6"));
407407
fail();
408-
} catch (DoNotRetryRegionException e) {
408+
} catch (DoNotRetryIOException e) {
409409
// Expected
410410
}
411411
Thread.sleep(2000);

0 commit comments

Comments
 (0)