You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2017/11/09 19:34:37 UTC
hbase git commit: HBASE-19127: Set State.SPLITTING, MERGING,
MERGING_NEW, SPLITTING_NEW properly in RegionStatesNode
Repository: hbase
Updated Branches:
refs/heads/master 252ab3082 -> 0ec96a5ff
HBASE-19127: Set State.SPLITTING, MERGING, MERGING_NEW, SPLITTING_NEW properly in RegionStatesNode
Signed-off-by: Michael Stack <st...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/0ec96a5f
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/0ec96a5f
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/0ec96a5f
Branch: refs/heads/master
Commit: 0ec96a5ffebfb842e2434b6d487e8da8f0d8843e
Parents: 252ab30
Author: Yi Liang <yl...@us.ibm.com>
Authored: Wed Nov 8 09:38:46 2017 -0800
Committer: Michael Stack <st...@apache.org>
Committed: Thu Nov 9 11:34:29 2017 -0800
----------------------------------------------------------------------
.../src/main/protobuf/MasterProcedure.proto | 18 +++----
.../master/assignment/AssignmentManager.java | 5 ++
.../assignment/MergeTableRegionsProcedure.java | 29 ++++++-----
.../hbase/master/assignment/RegionStates.java | 2 +-
.../assignment/SplitTableRegionProcedure.java | 52 +++++++++++---------
5 files changed, 60 insertions(+), 46 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/0ec96a5f/hbase-protocol-shaded/src/main/protobuf/MasterProcedure.proto
----------------------------------------------------------------------
diff --git a/hbase-protocol-shaded/src/main/protobuf/MasterProcedure.proto b/hbase-protocol-shaded/src/main/protobuf/MasterProcedure.proto
index 635beaf..f9b8807 100644
--- a/hbase-protocol-shaded/src/main/protobuf/MasterProcedure.proto
+++ b/hbase-protocol-shaded/src/main/protobuf/MasterProcedure.proto
@@ -256,16 +256,14 @@ message SplitTableRegionStateData {
enum MergeTableRegionsState {
MERGE_TABLE_REGIONS_PREPARE = 1;
MERGE_TABLE_REGIONS_PRE_OPERATION = 2;
- MERGE_TABLE_REGIONS_MOVE_REGION_TO_SAME_RS = 3;
- MERGE_TABLE_REGIONS_PRE_MERGE_OPERATION = 4;
- MERGE_TABLE_REGIONS_SET_MERGING_TABLE_STATE = 5;
- MERGE_TABLE_REGIONS_CLOSE_REGIONS = 6;
- MERGE_TABLE_REGIONS_CREATE_MERGED_REGION = 7;
- MERGE_TABLE_REGIONS_PRE_MERGE_COMMIT_OPERATION = 8;
- MERGE_TABLE_REGIONS_UPDATE_META = 9;
- MERGE_TABLE_REGIONS_POST_MERGE_COMMIT_OPERATION = 10;
- MERGE_TABLE_REGIONS_OPEN_MERGED_REGION = 11;
- MERGE_TABLE_REGIONS_POST_OPERATION = 12;
+ MERGE_TABLE_REGIONS_PRE_MERGE_OPERATION = 3;
+ MERGE_TABLE_REGIONS_CLOSE_REGIONS = 4;
+ MERGE_TABLE_REGIONS_CREATE_MERGED_REGION = 5;
+ MERGE_TABLE_REGIONS_PRE_MERGE_COMMIT_OPERATION = 6;
+ MERGE_TABLE_REGIONS_UPDATE_META = 7;
+ MERGE_TABLE_REGIONS_POST_MERGE_COMMIT_OPERATION = 8;
+ MERGE_TABLE_REGIONS_OPEN_MERGED_REGION = 9;
+ MERGE_TABLE_REGIONS_POST_OPERATION = 10;
}
message MergeTableRegionsStateData {
http://git-wip-us.apache.org/repos/asf/hbase/blob/0ec96a5f/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
----------------------------------------------------------------------
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 f4a3ca8..1c193f9 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
@@ -1532,6 +1532,11 @@ public class AssignmentManager implements ServerListener {
// regionStates#getRegionsOfTable
final RegionStateNode node = regionStates.getOrCreateRegionNode(parent);
node.setState(State.SPLIT);
+ final RegionStateNode nodeA = regionStates.getOrCreateRegionNode(daughterA);
+ nodeA.setState(State.SPLITTING_NEW);
+ final RegionStateNode nodeB = regionStates.getOrCreateRegionNode(daughterB);
+ nodeB.setState(State.SPLITTING_NEW);
+
regionStateStore.splitRegion(parent, daughterA, daughterB, serverName);
if (shouldAssignFavoredNodes(parent)) {
List<ServerName> onlineServers = this.master.getServerManager().getOnlineServersList();
http://git-wip-us.apache.org/repos/asf/hbase/blob/0ec96a5f/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.java
----------------------------------------------------------------------
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 642bb0d..6663d7c 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
@@ -47,6 +47,7 @@ import org.apache.hadoop.hbase.master.CatalogJanitor;
import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
import org.apache.hadoop.hbase.master.MasterFileSystem;
import org.apache.hadoop.hbase.master.RegionState;
+import org.apache.hadoop.hbase.master.RegionState.State;
import org.apache.hadoop.hbase.master.normalizer.NormalizationPlan;
import org.apache.hadoop.hbase.master.procedure.AbstractStateMachineTableProcedure;
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
@@ -222,10 +223,6 @@ public class MergeTableRegionsProcedure
break;
case MERGE_TABLE_REGIONS_PRE_MERGE_OPERATION:
preMergeRegions(env);
- setNextState(MergeTableRegionsState.MERGE_TABLE_REGIONS_SET_MERGING_TABLE_STATE);
- break;
- case MERGE_TABLE_REGIONS_SET_MERGING_TABLE_STATE:
- setRegionStateToMerging(env);
setNextState(MergeTableRegionsState.MERGE_TABLE_REGIONS_CLOSE_REGIONS);
break;
case MERGE_TABLE_REGIONS_CLOSE_REGIONS:
@@ -295,14 +292,9 @@ public class MergeTableRegionsProcedure
case MERGE_TABLE_REGIONS_CLOSE_REGIONS:
rollbackCloseRegionsForMerge(env);
break;
- case MERGE_TABLE_REGIONS_SET_MERGING_TABLE_STATE:
- setRegionStateToRevertMerging(env);
- break;
case MERGE_TABLE_REGIONS_PRE_MERGE_OPERATION:
postRollBackMergeRegions(env);
break;
- case MERGE_TABLE_REGIONS_MOVE_REGION_TO_SAME_RS:
- break; // nothing to rollback
case MERGE_TABLE_REGIONS_PREPARE:
break;
default:
@@ -513,6 +505,8 @@ public class MergeTableRegionsProcedure
return false;
}
+ // Update region states to Merging
+ setRegionStateToMerging(env);
return true;
}
@@ -560,16 +554,23 @@ public class MergeTableRegionsProcedure
* @throws IOException
*/
public void setRegionStateToMerging(final MasterProcedureEnv env) throws IOException {
- //transition.setTransitionCode(TransitionCode.READY_TO_MERGE);
+ // Set State.MERGING to regions to be merged
+ RegionStates regionStates = env.getAssignmentManager().getRegionStates();
+ regionStates.getRegionNode(regionsToMerge[0]).setState(State.MERGING);
+ regionStates.getRegionNode(regionsToMerge[1]).setState(State.MERGING);
}
/**
* Rollback the region state change
+ * Not used for now, since rollbackCloseRegionsForMerge() will mark regions as OPEN
* @param env MasterProcedureEnv
* @throws IOException
*/
- private void setRegionStateToRevertMerging(final MasterProcedureEnv env) throws IOException {
- //transition.setTransitionCode(TransitionCode.MERGE_REVERTED);
+ private void setRegionStateBackToOpen(final MasterProcedureEnv env) throws IOException {
+ // revert region state to Open
+ RegionStates regionStates = env.getAssignmentManager().getRegionStates();
+ regionStates.getRegionNode(regionsToMerge[0]).setState(State.OPEN);
+ regionStates.getRegionNode(regionsToMerge[1]).setState(State.OPEN);
}
/**
@@ -591,6 +592,10 @@ public class MergeTableRegionsProcedure
mergeStoreFiles(env, regionFs2, regionFs.getMergesDir());
regionFs.commitMergedRegion(mergedRegion);
+
+ //Prepare to create merged regions
+ env.getAssignmentManager().getRegionStates().
+ getOrCreateRegionNode(mergedRegion).setState(State.MERGING_NEW);
}
/**
http://git-wip-us.apache.org/repos/asf/hbase/blob/0ec96a5f/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java
index f404abb..682d529 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java
@@ -67,7 +67,7 @@ public class RegionStates {
};
protected static final State[] STATES_EXPECTED_ON_CLOSE = new State[] {
- State.SPLITTING, State.SPLIT, // ServerCrashProcedure
+ State.SPLITTING, State.SPLIT, State.MERGING, // ServerCrashProcedure
State.OPEN, // enabled/open
State.CLOSING // already in-progress (retrying)
};
http://git-wip-us.apache.org/repos/asf/hbase/blob/0ec96a5f/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java
----------------------------------------------------------------------
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 201d0ae..1eb00c9 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
@@ -42,6 +42,7 @@ import org.apache.hadoop.hbase.DoNotRetryIOException;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.UnknownRegionException;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
import org.apache.hadoop.hbase.client.MasterSwitchType;
import org.apache.hadoop.hbase.client.Mutation;
@@ -406,31 +407,32 @@ public class SplitTableRegionProcedure
public boolean prepareSplitRegion(final MasterProcedureEnv env) throws IOException {
// Check whether the region is splittable
RegionStateNode node =
- env.getAssignmentManager().getRegionStates().getRegionNode(getParentRegion());
- RegionInfo parentHRI = null;
- if (node != null) {
- parentHRI = node.getRegionInfo();
+ env.getAssignmentManager().getRegionStates().getRegionNode(getParentRegion());
- // Lookup the parent HRI state from the AM, which has the latest updated info.
- // Protect against the case where concurrent SPLIT requests came in and succeeded
- // just before us.
- if (node.isInState(State.SPLIT)) {
- LOG.info("Split of " + parentHRI + " skipped; state is already SPLIT");
- return false;
- }
- if (parentHRI.isSplit() || parentHRI.isOffline()) {
- LOG.info("Split of " + parentHRI + " skipped because offline/split.");
- return false;
- }
+ if (node == null) {
+ throw new UnknownRegionException(getParentRegion().getRegionNameAsString());
+ }
- // expected parent to be online or closed
- if (!node.isInState(EXPECTED_SPLIT_STATES)) {
- // We may have SPLIT already?
- setFailure(new IOException("Split " + parentHRI.getRegionNameAsString() +
- " FAILED because state=" + node.getState() + "; expected " +
- Arrays.toString(EXPECTED_SPLIT_STATES)));
- return false;
- }
+ RegionInfo parentHRI = node.getRegionInfo();
+ // Lookup the parent HRI state from the AM, which has the latest updated info.
+ // Protect against the case where concurrent SPLIT requests came in and succeeded
+ // just before us.
+ if (node.isInState(State.SPLIT)) {
+ LOG.info("Split of " + parentHRI + " skipped; state is already SPLIT");
+ return false;
+ }
+ if (parentHRI.isSplit() || parentHRI.isOffline()) {
+ LOG.info("Split of " + parentHRI + " skipped because offline/split.");
+ return false;
+ }
+
+ // expected parent to be online or closed
+ if (!node.isInState(EXPECTED_SPLIT_STATES)) {
+ // We may have SPLIT already?
+ setFailure(new IOException("Split " + parentHRI.getRegionNameAsString() +
+ " FAILED because state=" + node.getState() + "; expected " +
+ Arrays.toString(EXPECTED_SPLIT_STATES)));
+ return false;
}
// Since we have the lock and the master is coordinating the operation
@@ -442,6 +444,10 @@ public class SplitTableRegionProcedure
" failed due to split switch off"));
return false;
}
+
+ // set node state as SPLITTING
+ node.setState(State.SPLITTING);
+
return true;
}