This is an automated email from the ASF dual-hosted git repository. zhangduo pushed a commit to branch branch-2.5 in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2.5 by this push: new c3215d586c6 HBASE-28405 Fix failed procedure rollback when region was not closed and is still in state merging (#5799) c3215d586c6 is described below commit c3215d586c6be149189a0229ca8cf6db6087174d Author: Aman Poonia <aman.poonia...@gmail.com> AuthorDate: Sun Apr 28 07:16:09 2024 +0530 HBASE-28405 Fix failed procedure rollback when region was not closed and is still in state merging (#5799) Co-authored-by: Duo Zhang <zhang...@apache.org> Signed-off-by: Duo Zhang <zhang...@apache.org> Signed-off-by: Viraj Jasani <vjas...@apache.org> (cherry picked from commit ba099131ca14ce861b25462f2daba9cce7bc90e4) --- .../assignment/MergeTableRegionsProcedure.java | 30 ++++++++++++++++++++-- .../hbase/namespace/TestNamespaceAuditor.java | 4 +-- 2 files changed, 30 insertions(+), 4 deletions(-) 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 813caa47d33..35711f85d02 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 @@ -292,6 +292,7 @@ public class MergeTableRegionsProcedure postRollBackMergeRegions(env); break; case MERGE_TABLE_REGIONS_PREPARE: + rollbackPrepareMerge(env); break; default: throw new UnsupportedOperationException(this + " unhandled state=" + state); @@ -514,6 +515,19 @@ public class MergeTableRegionsProcedure return response.hasMergeable() && response.getMergeable(); } + /** + * Action for rollback a merge table after prepare merge + */ + private void rollbackPrepareMerge(final MasterProcedureEnv env) throws IOException { + for (RegionInfo rinfo : regionsToMerge) { + RegionStateNode regionStateNode = + env.getAssignmentManager().getRegionStates().getRegionStateNode(rinfo); + if (regionStateNode.getState() == State.MERGING) { + regionStateNode.setState(State.OPEN); + } + } + } + /** * Pre merge region action * @param env MasterProcedureEnv @@ -639,8 +653,20 @@ public class MergeTableRegionsProcedure * Rollback close regions **/ private void rollbackCloseRegionsForMerge(MasterProcedureEnv env) throws IOException { - AssignmentManagerUtil.reopenRegionsForRollback(env, Arrays.asList(regionsToMerge), - getRegionReplication(env), getServerName(env)); + // At this point we should check if region was actually closed. If it was not closed then we + // don't need to repoen the region and we can just change the regionNode state to OPEN. + // if it is alredy closed then we need to do a reopen of region + List<RegionInfo> toAssign = new ArrayList<>(); + for (RegionInfo rinfo : regionsToMerge) { + RegionStateNode regionStateNode = + env.getAssignmentManager().getRegionStates().getRegionStateNode(rinfo); + if (regionStateNode.getState() != State.MERGING) { + // same as before HBASE-28405 + toAssign.add(rinfo); + } + } + AssignmentManagerUtil.reopenRegionsForRollback(env, toAssign, getRegionReplication(env), + getServerName(env)); } private TransitRegionStateProcedure[] createUnassignProcedures(MasterProcedureEnv env) diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java index 96545c4ee72..655da57a28e 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java @@ -37,6 +37,7 @@ import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.Coprocessor; import org.apache.hadoop.hbase.CoprocessorEnvironment; +import org.apache.hadoop.hbase.DoNotRetryIOException; import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.HColumnDescriptor; @@ -52,7 +53,6 @@ import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.CompactionState; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; -import org.apache.hadoop.hbase.client.DoNotRetryRegionException; import org.apache.hadoop.hbase.client.RegionInfo; import org.apache.hadoop.hbase.client.RegionLocator; import org.apache.hadoop.hbase.client.Table; @@ -405,7 +405,7 @@ public class TestNamespaceAuditor { try { ADMIN.split(tableTwo, Bytes.toBytes("6")); fail(); - } catch (DoNotRetryRegionException e) { + } catch (DoNotRetryIOException e) { // Expected } Thread.sleep(2000);