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 2019/03/01 13:22:13 UTC
[hbase] branch branch-2.2 updated: HBASE-21082 Reimplement
assign/unassign related procedure metrics
This is an automated email from the ASF dual-hosted git repository.
zhangduo pushed a commit to branch branch-2.2
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2.2 by this push:
new 3e1de60 HBASE-21082 Reimplement assign/unassign related procedure metrics
3e1de60 is described below
commit 3e1de603bdd7c9ddc0cb58b7a278294d4e5d1f72
Author: Duo Zhang <zh...@apache.org>
AuthorDate: Wed Feb 27 17:08:24 2019 +0800
HBASE-21082 Reimplement assign/unassign related procedure metrics
Signed-off-by: Guanghao Zhang <zg...@apache.org>
---
.../master/MetricsAssignmentManagerSource.java | 28 +++++-
.../master/MetricsAssignmentManagerSourceImpl.java | 28 ++++++
.../src/main/protobuf/MasterProcedure.proto | 15 ++-
.../hbase/master/MetricsAssignmentManager.java | 36 +++++++
.../master/assignment/CloseRegionProcedure.java | 6 ++
.../master/assignment/OpenRegionProcedure.java | 6 ++
.../assignment/TransitRegionStateProcedure.java | 105 ++++++++++++++++-----
.../master/assignment/TestAssignmentManager.java | 44 +++++++++
.../assignment/TestAssignmentManagerBase.java | 26 ++++-
.../hbase/master/assignment/TestRegionBypass.java | 18 ++--
10 files changed, 269 insertions(+), 43 deletions(-)
diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSource.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSource.java
index 92d447c..e714fd1 100644
--- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSource.java
+++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSource.java
@@ -60,6 +60,10 @@ public interface MetricsAssignmentManagerSource extends BaseSource {
String ASSIGN_METRIC_PREFIX = "assign";
String UNASSIGN_METRIC_PREFIX = "unassign";
+ String MOVE_METRIC_PREFIX = "move";
+ String REOPEN_METRIC_PREFIX = "reopen";
+ String OPEN_METRIC_PREFIX = "open";
+ String CLOSE_METRIC_PREFIX = "close";
String SPLIT_METRIC_PREFIX = "split";
String MERGE_METRIC_PREFIX = "merge";
@@ -95,16 +99,36 @@ public interface MetricsAssignmentManagerSource extends BaseSource {
void incrementOperationCounter();
/**
- * @return {@link OperationMetrics} containing common metrics for assign operation
+ * @return {@link OperationMetrics} containing common metrics for assign region operation
*/
OperationMetrics getAssignMetrics();
/**
- * @return {@link OperationMetrics} containing common metrics for unassign operation
+ * @return {@link OperationMetrics} containing common metrics for unassign region operation
*/
OperationMetrics getUnassignMetrics();
/**
+ * @return {@link OperationMetrics} containing common metrics for move region operation
+ */
+ OperationMetrics getMoveMetrics();
+
+ /**
+ * @return {@link OperationMetrics} containing common metrics for reopen region operation
+ */
+ OperationMetrics getReopenMetrics();
+
+ /**
+ * @return {@link OperationMetrics} containing common metrics for open region request
+ */
+ OperationMetrics getOpenMetrics();
+
+ /**
+ * @return {@link OperationMetrics} containing common metrics for close region request
+ */
+ OperationMetrics getCloseMetrics();
+
+ /**
* @return {@link OperationMetrics} containing common metrics for split operation
*/
OperationMetrics getSplitMetrics();
diff --git a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.java b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.java
index a702f70..2532a2d 100644
--- a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.java
+++ b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.java
@@ -39,6 +39,10 @@ public class MetricsAssignmentManagerSourceImpl
private OperationMetrics assignMetrics;
private OperationMetrics unassignMetrics;
+ private OperationMetrics moveMetrics;
+ private OperationMetrics reopenMetrics;
+ private OperationMetrics openMetrics;
+ private OperationMetrics closeMetrics;
private OperationMetrics splitMetrics;
private OperationMetrics mergeMetrics;
@@ -67,6 +71,10 @@ public class MetricsAssignmentManagerSourceImpl
*/
assignMetrics = new OperationMetrics(registry, ASSIGN_METRIC_PREFIX);
unassignMetrics = new OperationMetrics(registry, UNASSIGN_METRIC_PREFIX);
+ moveMetrics = new OperationMetrics(registry, MOVE_METRIC_PREFIX);
+ reopenMetrics = new OperationMetrics(registry, REOPEN_METRIC_PREFIX);
+ openMetrics = new OperationMetrics(registry, OPEN_METRIC_PREFIX);
+ closeMetrics = new OperationMetrics(registry, CLOSE_METRIC_PREFIX);
splitMetrics = new OperationMetrics(registry, SPLIT_METRIC_PREFIX);
mergeMetrics = new OperationMetrics(registry, MERGE_METRIC_PREFIX);
}
@@ -115,4 +123,24 @@ public class MetricsAssignmentManagerSourceImpl
public OperationMetrics getMergeMetrics() {
return mergeMetrics;
}
+
+ @Override
+ public OperationMetrics getMoveMetrics() {
+ return moveMetrics;
+ }
+
+ @Override
+ public OperationMetrics getReopenMetrics() {
+ return reopenMetrics;
+ }
+
+ @Override
+ public OperationMetrics getOpenMetrics() {
+ return openMetrics;
+ }
+
+ @Override
+ public OperationMetrics getCloseMetrics() {
+ return closeMetrics;
+ }
}
diff --git a/hbase-protocol-shaded/src/main/protobuf/MasterProcedure.proto b/hbase-protocol-shaded/src/main/protobuf/MasterProcedure.proto
index 1901282..0e7e79b 100644
--- a/hbase-protocol-shaded/src/main/protobuf/MasterProcedure.proto
+++ b/hbase-protocol-shaded/src/main/protobuf/MasterProcedure.proto
@@ -471,12 +471,17 @@ enum RegionStateTransitionState {
REGION_STATE_TRANSITION_CONFIRM_CLOSED = 5;
}
+enum RegionTransitionType {
+ ASSIGN = 1;
+ UNASSIGN = 2;
+ MOVE = 3;
+ REOPEN = 4;
+}
+
message RegionStateTransitionStateData {
- required RegionStateTransitionState initialState = 1;
- required RegionStateTransitionState lastState = 2;
- optional ServerName assign_candidate = 3;
- required bool force_new_plan = 4;
- optional bool override = 5 [default = false];
+ required RegionTransitionType type = 1;
+ optional ServerName assign_candidate = 2;
+ required bool force_new_plan = 3;
}
message RegionRemoteProcedureBaseStateData {
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManager.java
index d13ffe9..8b214f8 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManager.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManager.java
@@ -30,6 +30,10 @@ public class MetricsAssignmentManager {
private final ProcedureMetrics assignProcMetrics;
private final ProcedureMetrics unassignProcMetrics;
+ private final ProcedureMetrics moveProcMetrics;
+ private final ProcedureMetrics reopenProcMetrics;
+ private final ProcedureMetrics openProcMetrics;
+ private final ProcedureMetrics closeProcMetrics;
private final ProcedureMetrics splitProcMetrics;
private final ProcedureMetrics mergeProcMetrics;
@@ -39,6 +43,10 @@ public class MetricsAssignmentManager {
assignProcMetrics = convertToProcedureMetrics(assignmentManagerSource.getAssignMetrics());
unassignProcMetrics = convertToProcedureMetrics(assignmentManagerSource.getUnassignMetrics());
+ moveProcMetrics = convertToProcedureMetrics(assignmentManagerSource.getMoveMetrics());
+ reopenProcMetrics = convertToProcedureMetrics(assignmentManagerSource.getReopenMetrics());
+ openProcMetrics = convertToProcedureMetrics(assignmentManagerSource.getOpenMetrics());
+ closeProcMetrics = convertToProcedureMetrics(assignmentManagerSource.getCloseMetrics());
splitProcMetrics = convertToProcedureMetrics(assignmentManagerSource.getSplitMetrics());
mergeProcMetrics = convertToProcedureMetrics(assignmentManagerSource.getMergeMetrics());
}
@@ -103,6 +111,34 @@ public class MetricsAssignmentManager {
}
/**
+ * @return Set of common metrics for move procedure
+ */
+ public ProcedureMetrics getMoveProcMetrics() {
+ return moveProcMetrics;
+ }
+
+ /**
+ * @return Set of common metrics for reopen procedure
+ */
+ public ProcedureMetrics getReopenProcMetrics() {
+ return reopenProcMetrics;
+ }
+
+ /**
+ * @return Set of common metrics for OpenRegionProcedure
+ */
+ public ProcedureMetrics getOpenProcMetrics() {
+ return openProcMetrics;
+ }
+
+ /**
+ * @return Set of common metrics for CloseRegionProcedure
+ */
+ public ProcedureMetrics getCloseProcMetrics() {
+ return closeProcMetrics;
+ }
+
+ /**
* @return Set of common metrics for split procedure
*/
public ProcedureMetrics getSplitProcMetrics() {
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.java
index fd672fa..f867e96 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/CloseRegionProcedure.java
@@ -23,6 +23,7 @@ import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.master.RegionState;
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
import org.apache.hadoop.hbase.master.procedure.RSProcedureDispatcher.RegionCloseOperation;
+import org.apache.hadoop.hbase.procedure2.ProcedureMetrics;
import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer;
import org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.RemoteOperation;
import org.apache.yetus.audience.InterfaceAudience;
@@ -82,6 +83,11 @@ public class CloseRegionProcedure extends RegionRemoteProcedureBase {
}
@Override
+ protected ProcedureMetrics getProcedureMetrics(MasterProcedureEnv env) {
+ return env.getAssignmentManager().getAssignmentManagerMetrics().getCloseProcMetrics();
+ }
+
+ @Override
protected boolean shouldDispatch(RegionStateNode regionNode) {
return regionNode.isInState(RegionState.State.CLOSING);
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.java
index ed5836d..4b3a976 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.java
@@ -23,6 +23,7 @@ import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.master.RegionState;
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
import org.apache.hadoop.hbase.master.procedure.RSProcedureDispatcher.RegionOpenOperation;
+import org.apache.hadoop.hbase.procedure2.ProcedureMetrics;
import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer;
import org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.RemoteOperation;
import org.apache.yetus.audience.InterfaceAudience;
@@ -67,6 +68,11 @@ public class OpenRegionProcedure extends RegionRemoteProcedureBase {
}
@Override
+ protected ProcedureMetrics getProcedureMetrics(MasterProcedureEnv env) {
+ return env.getAssignmentManager().getAssignmentManagerMetrics().getOpenProcMetrics();
+ }
+
+ @Override
protected boolean shouldDispatch(RegionStateNode regionNode) {
return regionNode.isInState(RegionState.State.OPENING);
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.java
index 2d022b7..d3429b5 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.java
@@ -29,6 +29,7 @@ import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.client.RegionReplicaUtil;
import org.apache.hadoop.hbase.client.RetriesExhaustedException;
import org.apache.hadoop.hbase.exceptions.UnexpectedStateException;
+import org.apache.hadoop.hbase.master.MetricsAssignmentManager;
import org.apache.hadoop.hbase.master.RegionState.State;
import org.apache.hadoop.hbase.master.procedure.AbstractStateMachineRegionProcedure;
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
@@ -48,6 +49,7 @@ import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesti
import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionStateData;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionTransitionType;
import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;
import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;
@@ -106,6 +108,8 @@ public class TransitRegionStateProcedure
private static final Logger LOG = LoggerFactory.getLogger(TransitRegionStateProcedure.class);
+ private TransitionType type;
+
private RegionStateTransitionState initialState;
private RegionStateTransitionState lastState;
@@ -120,15 +124,33 @@ public class TransitRegionStateProcedure
public TransitRegionStateProcedure() {
}
+ private void setInitalAndLastState() {
+ switch (type) {
+ case ASSIGN:
+ initialState = RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE;
+ lastState = RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED;
+ break;
+ case UNASSIGN:
+ initialState = RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE;
+ lastState = RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED;
+ break;
+ case MOVE:
+ case REOPEN:
+ initialState = RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE;
+ lastState = RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED;
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown TransitionType: " + type);
+ }
+ }
@VisibleForTesting
protected TransitRegionStateProcedure(MasterProcedureEnv env, RegionInfo hri,
- ServerName assignCandidate, boolean forceNewPlan, RegionStateTransitionState initialState,
- RegionStateTransitionState lastState) {
+ ServerName assignCandidate, boolean forceNewPlan, TransitionType type) {
super(env, hri);
this.assignCandidate = assignCandidate;
this.forceNewPlan = forceNewPlan;
- this.initialState = initialState;
- this.lastState = lastState;
+ this.type = type;
+ setInitalAndLastState();
}
@Override
@@ -548,11 +570,41 @@ public class TransitRegionStateProcedure
return initialState;
}
+ private static TransitionType convert(RegionTransitionType type) {
+ switch (type) {
+ case ASSIGN:
+ return TransitionType.ASSIGN;
+ case UNASSIGN:
+ return TransitionType.UNASSIGN;
+ case MOVE:
+ return TransitionType.MOVE;
+ case REOPEN:
+ return TransitionType.REOPEN;
+ default:
+ throw new IllegalArgumentException("Unknown RegionTransitionType: " + type);
+ }
+ }
+
+ private static RegionTransitionType convert(TransitionType type) {
+ switch (type) {
+ case ASSIGN:
+ return RegionTransitionType.ASSIGN;
+ case UNASSIGN:
+ return RegionTransitionType.UNASSIGN;
+ case MOVE:
+ return RegionTransitionType.MOVE;
+ case REOPEN:
+ return RegionTransitionType.REOPEN;
+ default:
+ throw new IllegalArgumentException("Unknown TransitionType: " + type);
+ }
+ }
+
@Override
protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {
super.serializeStateData(serializer);
RegionStateTransitionStateData.Builder builder = RegionStateTransitionStateData.newBuilder()
- .setInitialState(initialState).setLastState(lastState).setForceNewPlan(forceNewPlan);
+ .setType(convert(type)).setForceNewPlan(forceNewPlan);
if (assignCandidate != null) {
builder.setAssignCandidate(ProtobufUtil.toServerName(assignCandidate));
}
@@ -564,8 +616,8 @@ public class TransitRegionStateProcedure
super.deserializeStateData(serializer);
RegionStateTransitionStateData data =
serializer.deserialize(RegionStateTransitionStateData.class);
- initialState = data.getInitialState();
- lastState = data.getLastState();
+ type = convert(data.getType());
+ setInitalAndLastState();
forceNewPlan = data.getForceNewPlan();
if (data.hasAssignCandidate()) {
assignCandidate = ProtobufUtil.toServerName(data.getAssignCandidate());
@@ -574,11 +626,18 @@ public class TransitRegionStateProcedure
@Override
protected ProcedureMetrics getProcedureMetrics(MasterProcedureEnv env) {
- // TODO: need to reimplement the metrics system for assign/unassign
- if (initialState == RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE) {
- return env.getAssignmentManager().getAssignmentManagerMetrics().getAssignProcMetrics();
- } else {
- return env.getAssignmentManager().getAssignmentManagerMetrics().getUnassignProcMetrics();
+ MetricsAssignmentManager metrics = env.getAssignmentManager().getAssignmentManagerMetrics();
+ switch (type) {
+ case ASSIGN:
+ return metrics.getAssignProcMetrics();
+ case UNASSIGN:
+ return metrics.getUnassignProcMetrics();
+ case MOVE:
+ return metrics.getMoveProcMetrics();
+ case REOPEN:
+ return metrics.getReopenProcMetrics();
+ default:
+ throw new IllegalArgumentException("Unknown transition type: " + type);
}
}
@@ -600,36 +659,32 @@ public class TransitRegionStateProcedure
return proc;
}
+ public enum TransitionType {
+ ASSIGN, UNASSIGN, MOVE, REOPEN
+ }
+
// Be careful that, when you call these 4 methods below, you need to manually attach the returned
// procedure with the RegionStateNode, otherwise the procedure will quit immediately without doing
// anything. See the comment in executeFromState to find out why we need this assumption.
public static TransitRegionStateProcedure assign(MasterProcedureEnv env, RegionInfo region,
@Nullable ServerName targetServer) {
return setOwner(env,
- new TransitRegionStateProcedure(env, region, targetServer, false,
- RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE,
- RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED));
+ new TransitRegionStateProcedure(env, region, targetServer, false, TransitionType.ASSIGN));
}
public static TransitRegionStateProcedure unassign(MasterProcedureEnv env, RegionInfo region) {
return setOwner(env,
- new TransitRegionStateProcedure(env, region, null, false,
- RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE,
- RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED));
+ new TransitRegionStateProcedure(env, region, null, false, TransitionType.UNASSIGN));
}
public static TransitRegionStateProcedure reopen(MasterProcedureEnv env, RegionInfo region) {
return setOwner(env,
- new TransitRegionStateProcedure(env, region, null, false,
- RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE,
- RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED));
+ new TransitRegionStateProcedure(env, region, null, false, TransitionType.REOPEN));
}
public static TransitRegionStateProcedure move(MasterProcedureEnv env, RegionInfo region,
@Nullable ServerName targetServer) {
- return setOwner(env,
- new TransitRegionStateProcedure(env, region, targetServer, targetServer == null,
- RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE,
- RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED));
+ return setOwner(env, new TransitRegionStateProcedure(env, region, targetServer,
+ targetServer == null, TransitionType.MOVE));
}
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.java
index 4f0e2a9..6a08070 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.java
@@ -239,4 +239,48 @@ public class TestAssignmentManager extends TestAssignmentManagerBase {
// set it back as default, see setUpMeta()
am.wakeMetaLoadedEvent();
}
+
+ private void assertCloseThenOpen() {
+ assertEquals(closeSubmittedCount + 1, closeProcMetrics.getSubmittedCounter().getCount());
+ assertEquals(closeFailedCount, closeProcMetrics.getFailedCounter().getCount());
+ assertEquals(openSubmittedCount + 1, openProcMetrics.getSubmittedCounter().getCount());
+ assertEquals(openFailedCount, openProcMetrics.getFailedCounter().getCount());
+ }
+
+ @Test
+ public void testMove() throws Exception {
+ TableName tableName = TableName.valueOf("testMove");
+ RegionInfo hri = createRegionInfo(tableName, 1);
+ rsDispatcher.setMockRsExecutor(new GoodRsExecutor());
+ am.assign(hri);
+
+ // collect AM metrics before test
+ collectAssignmentManagerMetrics();
+
+ am.move(hri);
+
+ assertEquals(moveSubmittedCount + 1, moveProcMetrics.getSubmittedCounter().getCount());
+ assertEquals(moveFailedCount, moveProcMetrics.getFailedCounter().getCount());
+ assertCloseThenOpen();
+ }
+
+ @Test
+ public void testReopen() throws Exception {
+ TableName tableName = TableName.valueOf("testReopen");
+ RegionInfo hri = createRegionInfo(tableName, 1);
+ rsDispatcher.setMockRsExecutor(new GoodRsExecutor());
+ am.assign(hri);
+
+ // collect AM metrics before test
+ collectAssignmentManagerMetrics();
+
+ TransitRegionStateProcedure proc =
+ TransitRegionStateProcedure.reopen(master.getMasterProcedureExecutor().getEnvironment(), hri);
+ am.getRegionStates().getRegionStateNode(hri).setProcedure(proc);
+ waitOnFuture(submitProcedure(proc));
+
+ assertEquals(reopenSubmittedCount + 1, reopenProcMetrics.getSubmittedCounter().getCount());
+ assertEquals(reopenFailedCount, reopenProcMetrics.getFailedCounter().getCount());
+ assertCloseThenOpen();
+ }
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestAssignmentManagerBase.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestAssignmentManagerBase.java
index 6a88d6b..fb6668a 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestAssignmentManagerBase.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestAssignmentManagerBase.java
@@ -112,11 +112,23 @@ public abstract class TestAssignmentManagerBase {
protected ProcedureMetrics assignProcMetrics;
protected ProcedureMetrics unassignProcMetrics;
+ protected ProcedureMetrics moveProcMetrics;
+ protected ProcedureMetrics reopenProcMetrics;
+ protected ProcedureMetrics openProcMetrics;
+ protected ProcedureMetrics closeProcMetrics;
protected long assignSubmittedCount = 0;
protected long assignFailedCount = 0;
protected long unassignSubmittedCount = 0;
protected long unassignFailedCount = 0;
+ protected long moveSubmittedCount = 0;
+ protected long moveFailedCount = 0;
+ protected long reopenSubmittedCount = 0;
+ protected long reopenFailedCount = 0;
+ protected long openSubmittedCount = 0;
+ protected long openFailedCount = 0;
+ protected long closeSubmittedCount = 0;
+ protected long closeFailedCount = 0;
protected int newRsAdded;
@@ -147,6 +159,10 @@ public abstract class TestAssignmentManagerBase {
am = master.getAssignmentManager();
assignProcMetrics = am.getAssignmentManagerMetrics().getAssignProcMetrics();
unassignProcMetrics = am.getAssignmentManagerMetrics().getUnassignProcMetrics();
+ moveProcMetrics = am.getAssignmentManagerMetrics().getMoveProcMetrics();
+ reopenProcMetrics = am.getAssignmentManagerMetrics().getReopenProcMetrics();
+ openProcMetrics = am.getAssignmentManagerMetrics().getOpenProcMetrics();
+ closeProcMetrics = am.getAssignmentManagerMetrics().getCloseProcMetrics();
setUpMeta();
}
@@ -654,10 +670,18 @@ public abstract class TestAssignmentManagerBase {
}
}
- protected void collectAssignmentManagerMetrics() {
+ protected final void collectAssignmentManagerMetrics() {
assignSubmittedCount = assignProcMetrics.getSubmittedCounter().getCount();
assignFailedCount = assignProcMetrics.getFailedCounter().getCount();
unassignSubmittedCount = unassignProcMetrics.getSubmittedCounter().getCount();
unassignFailedCount = unassignProcMetrics.getFailedCounter().getCount();
+ moveSubmittedCount = moveProcMetrics.getSubmittedCounter().getCount();
+ moveFailedCount = moveProcMetrics.getFailedCounter().getCount();
+ reopenSubmittedCount = reopenProcMetrics.getSubmittedCounter().getCount();
+ reopenFailedCount = reopenProcMetrics.getFailedCounter().getCount();
+ openSubmittedCount = openProcMetrics.getSubmittedCounter().getCount();
+ openFailedCount = openProcMetrics.getFailedCounter().getCount();
+ closeSubmittedCount = closeProcMetrics.getSubmittedCounter().getCount();
+ closeFailedCount = closeProcMetrics.getFailedCounter().getCount();
}
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionBypass.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionBypass.java
index 97dc37b..8f15997 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionBypass.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionBypass.java
@@ -25,13 +25,13 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CountDownLatch;
-
import org.apache.hadoop.hbase.HBaseClassTestRule;
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.RegionInfo;
+import org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure.TransitionType;
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
import org.apache.hadoop.hbase.procedure2.Procedure;
import org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException;
@@ -88,7 +88,7 @@ public class TestRegionBypass {
}
@Test
- public void testBypass() throws IOException {
+ public void testBypass() throws IOException, InterruptedException {
Admin admin = TEST_UTIL.getAdmin();
MasterProcedureEnv env =
TEST_UTIL.getHBaseCluster().getMaster().getMasterProcedureExecutor().getEnvironment();
@@ -99,14 +99,13 @@ public class TestRegionBypass {
List<Long> pids = new ArrayList<>(regions.size());
for (RegionInfo ri: regions) {
Procedure<MasterProcedureEnv> p = new StallingAssignProcedure(env, ri, null, false,
- RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE,
- RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED);
+ TransitionType.ASSIGN);
pids.add(TEST_UTIL.getHBaseCluster().getMaster().getMasterProcedureExecutor().
submitProcedure(p));
}
for (Long pid: pids) {
while (!TEST_UTIL.getHBaseCluster().getMaster().getMasterProcedureExecutor().isStarted(pid)) {
- Thread.currentThread().yield();
+ Thread.sleep(100);
}
}
List<Procedure<MasterProcedureEnv>> ps =
@@ -131,7 +130,7 @@ public class TestRegionBypass {
}
while (!TEST_UTIL.getHBaseCluster().getMaster().getMasterProcedureExecutor().
getActiveProcIds().isEmpty()) {
- Thread.currentThread().yield();
+ Thread.sleep(100);
}
// Now assign with the override flag.
for (RegionInfo ri: regions) {
@@ -139,7 +138,7 @@ public class TestRegionBypass {
}
while (!TEST_UTIL.getHBaseCluster().getMaster().getMasterProcedureExecutor().
getActiveProcIds().isEmpty()) {
- Thread.currentThread().yield();
+ Thread.sleep(100);
}
for (RegionInfo ri: regions) {
assertTrue(ri.toString(), TEST_UTIL.getMiniHBaseCluster().getMaster().getAssignmentManager().
@@ -156,9 +155,8 @@ public class TestRegionBypass {
public StallingAssignProcedure(){}
public StallingAssignProcedure(MasterProcedureEnv env, RegionInfo hri,
- ServerName assignCandidate, boolean forceNewPlan, RegionStateTransitionState initialState,
- RegionStateTransitionState lastState) {
- super(env, hri, assignCandidate, forceNewPlan, initialState, lastState);
+ ServerName assignCandidate, boolean forceNewPlan, TransitionType type) {
+ super(env, hri, assignCandidate, forceNewPlan, type);
init(env);
}