This is an automated email from the ASF dual-hosted git repository.
zghao pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new 45d7040 HBASE-23864 No need to submit
SplitTableRegionProcedure/MergeTableRegionsProcedure when split/merge is
disabled (#1185)
45d7040 is described below
commit 45d70403ad722f6d5a037e5c9b27534f5bcb4374
Author: Guanghao Zhang <[email protected]>
AuthorDate: Sat Feb 22 17:56:23 2020 +0800
HBASE-23864 No need to submit
SplitTableRegionProcedure/MergeTableRegionsProcedure when split/merge is
disabled (#1185)
Signed-off-by: binlijin <[email protected]>
Signed-off-by: stack <[email protected]>
Conflicts:
hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestSplitOrMergeStatus.java
---
.../main/java/org/apache/hadoop/hbase/master/HMaster.java | 14 ++++++++++++++
.../hadoop/hbase/master/assignment/AssignmentManager.java | 15 +++++++++++++++
.../master/assignment/MergeTableRegionsProcedure.java | 6 +++++-
.../master/assignment/SplitTableRegionProcedure.java | 7 +++++--
.../hadoop/hbase/client/TestSplitOrMergeStatus.java | 8 +++++++-
5 files changed, 46 insertions(+), 4 deletions(-)
diff --git
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
index a61750c..f97d89b 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
@@ -1819,6 +1819,13 @@ public class HMaster extends HRegionServer implements
MasterServices {
final long nonce) throws IOException {
checkInitialized();
+ if (!isSplitOrMergeEnabled(MasterSwitchType.MERGE)) {
+ String regionsStr = Arrays.deepToString(regionsToMerge);
+ LOG.warn("Merge switch is off! skip merge of " + regionsStr);
+ throw new DoNotRetryIOException("Merge of " + regionsStr +
+ " failed because merge switch is off");
+ }
+
final String mergeRegionsStr = Arrays.stream(regionsToMerge).
map(r -> RegionInfo.getShortNameToLog(r)).collect(Collectors.joining(",
"));
return MasterProcedureUtil.submitProcedure(new
NonceProcedureRunnable(this, ng, nonce) {
@@ -1844,6 +1851,13 @@ public class HMaster extends HRegionServer implements
MasterServices {
final long nonceGroup, final long nonce)
throws IOException {
checkInitialized();
+
+ if (!isSplitOrMergeEnabled(MasterSwitchType.SPLIT)) {
+ LOG.warn("Split switch is off! skip split of " + regionInfo);
+ throw new DoNotRetryIOException("Split region " +
regionInfo.getRegionNameAsString() +
+ " failed due to split switch off");
+ }
+
return MasterProcedureUtil.submitProcedure(
new MasterProcedureUtil.NonceProcedureRunnable(this, nonceGroup,
nonce) {
@Override
diff --git
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
index f47d625..800cd09 100644
---
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
+++
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
@@ -34,13 +34,16 @@ import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
+
import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.DoNotRetryIOException;
import org.apache.hadoop.hbase.HBaseIOException;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.PleaseHoldException;
import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.YouAreDeadException;
+import org.apache.hadoop.hbase.client.MasterSwitchType;
import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.client.RegionInfoBuilder;
import org.apache.hadoop.hbase.client.RegionStatesCount;
@@ -897,6 +900,12 @@ public class AssignmentManager implements ServerListener {
" hriA=" + hriA + " hriB=" + hriB);
}
+ if (!master.isSplitOrMergeEnabled(MasterSwitchType.SPLIT)) {
+ LOG.warn("Split switch is off! skip split of " + parent);
+ throw new DoNotRetryIOException("Split region " +
parent.getRegionNameAsString() +
+ " failed due to split switch off");
+ }
+
// Submit the Split procedure
final byte[] splitKey = hriB.getStartKey();
if (LOG.isDebugEnabled()) {
@@ -922,6 +931,12 @@ public class AssignmentManager implements ServerListener {
" maybe an old RS (< 2.0) had the operation in progress");
}
+ if (!master.isSplitOrMergeEnabled(MasterSwitchType.MERGE)) {
+ LOG.warn("Merge switch is off! skip merge of regionA=" + hriA + "
regionB=" + hriB);
+ throw new DoNotRetryIOException("Merge of regionA=" + hriA + " regionB="
+ hriB +
+ " failed because merge switch is off");
+ }
+
// Submit the Merge procedure
if (LOG.isDebugEnabled()) {
LOG.debug("Handling merge request from RS=" + merged + ", merged=" +
merged);
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 22442fd..1b46eff 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
@@ -472,6 +472,10 @@ public class MergeTableRegionsProcedure
throw new MergeRegionException("Skip merging regions " +
RegionInfo.getShortNameToLog(regionsToMerge) + ", because we are
snapshotting " + tn);
}
+
+ // Mostly this check is not used because we already check the switch
before submit a merge
+ // procedure. Just for safe, check the switch again. This procedure can be
rollbacked if
+ // the switch was set to false after submit.
if
(!env.getMasterServices().isSplitOrMergeEnabled(MasterSwitchType.MERGE)) {
String regionsStr = Arrays.deepToString(this.regionsToMerge);
LOG.warn("Merge switch is off! skip merge of " + regionsStr);
@@ -831,4 +835,4 @@ public class MergeTableRegionsProcedure
// range of steps; what do we do for these should an operator want to
cancel them? HBASE-20022.
return isRollbackSupported(getCurrentState()) && super.abort(env);
}
-}
\ No newline at end of file
+}
diff --git
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java
index 2856ab0..01c2186 100644
---
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java
+++
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java
@@ -501,8 +501,9 @@ public class SplitTableRegionProcedure
return false;
}
- // Since we have the lock and the master is coordinating the operation
- // we are always able to split the region
+ // Mostly this check is not used because we already check the switch
before submit a split
+ // procedure. Just for safe, check the switch again. This procedure can be
rollbacked if
+ // the switch was set to false after submit.
if
(!env.getMasterServices().isSplitOrMergeEnabled(MasterSwitchType.SPLIT)) {
LOG.warn("pid=" + getProcId() + " split switch is off! skip split of " +
parentHRI);
setFailure(new IOException("Split region " +
parentHRI.getRegionNameAsString() +
@@ -531,6 +532,8 @@ public class SplitTableRegionProcedure
// set node state as SPLITTING
node.setState(State.SPLITTING);
+ // Since we have the lock and the master is coordinating the operation
+ // we are always able to split the region
return true;
}
diff --git
a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestSplitOrMergeStatus.java
b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestSplitOrMergeStatus.java
index f974974..a46a58d 100644
---
a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestSplitOrMergeStatus.java
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestSplitOrMergeStatus.java
@@ -28,6 +28,7 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
+import org.apache.hadoop.hbase.DoNotRetryIOException;
import org.apache.hadoop.hbase.HBaseClassTestRule;
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.HRegionInfo;
@@ -96,7 +97,12 @@ public class TestSplitOrMergeStatus {
boolean[] results = admin.setSplitOrMergeEnabled(false, false,
MasterSwitchType.SPLIT);
assertEquals(1, results.length);
assertTrue(results[0]);
- admin.split(t.getName());
+ try {
+ admin.split(t.getName());
+ fail("Should not get here.");
+ } catch (DoNotRetryIOException e) {
+ // Expected.
+ }
int count = admin.getTableRegions(tableName).size();
assertTrue(originalCount == count);
results = admin.setSplitOrMergeEnabled(true, false,
MasterSwitchType.SPLIT);