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);

Reply via email to