This is an automated email from the ASF dual-hosted git repository.

zhangduo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/master by this push:
     new ba099131ca1 HBASE-28405 Fix failed procedure rollback when region was 
not closed and is still in state merging (#5799)
ba099131ca1 is described below

commit ba099131ca14ce861b25462f2daba9cce7bc90e4
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>
---
 .../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 7d4ec71d35b..b9a3ee13361 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
@@ -291,6 +291,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 a9d30fa7fcc..ab17f94389e 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.HBaseTestingUtil;
 import org.apache.hadoop.hbase.HConstants;
@@ -51,7 +52,6 @@ import 
org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
 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;
@@ -407,7 +407,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