You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2024/04/28 03:41:07 UTC
(hbase) branch branch-3 updated: HBASE-28405 Fix failed procedure rollback when region was not closed and is still in state merging (#5799)
This is an automated email from the ASF dual-hosted git repository.
zhangduo pushed a commit to branch branch-3
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-3 by this push:
new 7841810857c HBASE-28405 Fix failed procedure rollback when region was not closed and is still in state merging (#5799)
7841810857c is described below
commit 7841810857c202881758e090f71ce75956f29c4b
Author: Aman Poonia <am...@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 <zh...@apache.org>
Signed-off-by: Duo Zhang <zh...@apache.org>
Signed-off-by: Viraj Jasani <vj...@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 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);