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 2018/04/11 12:44:30 UTC
hbase git commit: HBASE-20367 Write a replication barrier for regions
when disabling a table
Repository: hbase
Updated Branches:
refs/heads/master a2b917277 -> 37e5b0b1b
HBASE-20367 Write a replication barrier for regions when disabling a table
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/37e5b0b1
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/37e5b0b1
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/37e5b0b1
Branch: refs/heads/master
Commit: 37e5b0b1b790fef25a544c282c6556e009269a0e
Parents: a2b9172
Author: zhangduo <zh...@apache.org>
Authored: Tue Apr 10 22:14:02 2018 +0800
Committer: zhangduo <zh...@apache.org>
Committed: Wed Apr 11 20:36:51 2018 +0800
----------------------------------------------------------------------
.../apache/hadoop/hbase/MetaTableAccessor.java | 2 +-
.../src/main/protobuf/MasterProcedure.proto | 1 +
.../master/procedure/DisableTableProcedure.java | 94 ++++++++++++--------
3 files changed, 58 insertions(+), 39 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/37e5b0b1/hbase-client/src/main/java/org/apache/hadoop/hbase/MetaTableAccessor.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/MetaTableAccessor.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/MetaTableAccessor.java
index 0f5ef09..e8ce811 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/MetaTableAccessor.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/MetaTableAccessor.java
@@ -1976,7 +1976,7 @@ public class MetaTableAccessor {
.setTimestamp(put.getTimestamp()).setType(Type.Put).setValue(value).build());
}
- private static Put makePutForReplicationBarrier(RegionInfo regionInfo, long openSeqNum, long ts)
+ public static Put makePutForReplicationBarrier(RegionInfo regionInfo, long openSeqNum, long ts)
throws IOException {
Put put = new Put(regionInfo.getRegionName(), ts);
addReplicationBarrier(put, openSeqNum);
http://git-wip-us.apache.org/repos/asf/hbase/blob/37e5b0b1/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 b37557c..cc31de3 100644
--- a/hbase-protocol-shaded/src/main/protobuf/MasterProcedure.proto
+++ b/hbase-protocol-shaded/src/main/protobuf/MasterProcedure.proto
@@ -171,6 +171,7 @@ enum DisableTableState {
DISABLE_TABLE_MARK_REGIONS_OFFLINE = 4;
DISABLE_TABLE_SET_DISABLED_TABLE_STATE = 5;
DISABLE_TABLE_POST_OPERATION = 6;
+ DISABLE_TABLE_ADD_REPLICATION_BARRIER = 7;
}
message DisableTableStateData {
http://git-wip-us.apache.org/repos/asf/hbase/blob/37e5b0b1/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DisableTableProcedure.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DisableTableProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DisableTableProcedure.java
index 413e3ae..f5caff7 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DisableTableProcedure.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DisableTableProcedure.java
@@ -19,20 +19,25 @@
package org.apache.hadoop.hbase.master.procedure;
import java.io.IOException;
-
import org.apache.hadoop.hbase.HBaseIOException;
import org.apache.hadoop.hbase.MetaTableAccessor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.TableNotEnabledException;
import org.apache.hadoop.hbase.TableNotFoundException;
-import org.apache.yetus.audience.InterfaceAudience;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.hadoop.hbase.client.BufferedMutator;
+import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.client.TableState;
import org.apache.hadoop.hbase.constraint.ConstraintException;
import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
+import org.apache.hadoop.hbase.master.MasterFileSystem;
import org.apache.hadoop.hbase.master.TableStateManager;
import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer;
+import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
+import org.apache.hadoop.hbase.wal.WALSplitter;
+import org.apache.yetus.audience.InterfaceAudience;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.DisableTableState;
@@ -81,48 +86,61 @@ public class DisableTableProcedure
@Override
protected Flow executeFromState(final MasterProcedureEnv env, final DisableTableState state)
throws InterruptedException {
- if (isTraceEnabled()) {
- LOG.trace(this + " execute state=" + state);
- }
-
+ LOG.trace("{} execute state={}", this, state);
try {
switch (state) {
- case DISABLE_TABLE_PREPARE:
- if (prepareDisable(env)) {
- setNextState(DisableTableState.DISABLE_TABLE_PRE_OPERATION);
- } else {
- assert isFailed() : "disable should have an exception here";
+ case DISABLE_TABLE_PREPARE:
+ if (prepareDisable(env)) {
+ setNextState(DisableTableState.DISABLE_TABLE_PRE_OPERATION);
+ } else {
+ assert isFailed() : "disable should have an exception here";
+ return Flow.NO_MORE_STATE;
+ }
+ break;
+ case DISABLE_TABLE_PRE_OPERATION:
+ preDisable(env, state);
+ setNextState(DisableTableState.DISABLE_TABLE_SET_DISABLING_TABLE_STATE);
+ break;
+ case DISABLE_TABLE_SET_DISABLING_TABLE_STATE:
+ setTableStateToDisabling(env, tableName);
+ setNextState(DisableTableState.DISABLE_TABLE_MARK_REGIONS_OFFLINE);
+ break;
+ case DISABLE_TABLE_MARK_REGIONS_OFFLINE:
+ addChildProcedure(env.getAssignmentManager().createUnassignProcedures(tableName));
+ setNextState(DisableTableState.DISABLE_TABLE_SET_DISABLED_TABLE_STATE);
+ break;
+ case DISABLE_TABLE_ADD_REPLICATION_BARRIER:
+ if (env.getMasterServices().getTableDescriptors().get(tableName)
+ .hasGlobalReplicationScope()) {
+ MasterFileSystem mfs = env.getMasterServices().getMasterFileSystem();
+ try (BufferedMutator mutator = env.getMasterServices().getConnection()
+ .getBufferedMutator(TableName.META_TABLE_NAME)) {
+ for (RegionInfo region : env.getAssignmentManager().getRegionStates()
+ .getRegionsOfTable(tableName)) {
+ long maxSequenceId =
+ WALSplitter.getMaxRegionSequenceId(mfs.getFileSystem(), mfs.getRegionDir(region));
+ mutator.mutate(MetaTableAccessor.makePutForReplicationBarrier(region, maxSequenceId,
+ EnvironmentEdgeManager.currentTime()));
+ }
+ }
+ }
+ setNextState(DisableTableState.DISABLE_TABLE_SET_DISABLED_TABLE_STATE);
+ break;
+ case DISABLE_TABLE_SET_DISABLED_TABLE_STATE:
+ setTableStateToDisabled(env, tableName);
+ setNextState(DisableTableState.DISABLE_TABLE_POST_OPERATION);
+ break;
+ case DISABLE_TABLE_POST_OPERATION:
+ postDisable(env, state);
return Flow.NO_MORE_STATE;
- }
- break;
- case DISABLE_TABLE_PRE_OPERATION:
- preDisable(env, state);
- setNextState(DisableTableState.DISABLE_TABLE_SET_DISABLING_TABLE_STATE);
- break;
- case DISABLE_TABLE_SET_DISABLING_TABLE_STATE:
- setTableStateToDisabling(env, tableName);
- setNextState(DisableTableState.DISABLE_TABLE_MARK_REGIONS_OFFLINE);
- break;
- case DISABLE_TABLE_MARK_REGIONS_OFFLINE:
- addChildProcedure(env.getAssignmentManager().createUnassignProcedures(tableName));
- setNextState(DisableTableState.DISABLE_TABLE_SET_DISABLED_TABLE_STATE);
- break;
- case DISABLE_TABLE_SET_DISABLED_TABLE_STATE:
- setTableStateToDisabled(env, tableName);
- setNextState(DisableTableState.DISABLE_TABLE_POST_OPERATION);
- break;
- case DISABLE_TABLE_POST_OPERATION:
- postDisable(env, state);
- return Flow.NO_MORE_STATE;
- default:
- throw new UnsupportedOperationException("Unhandled state=" + state);
+ default:
+ throw new UnsupportedOperationException("Unhandled state=" + state);
}
} catch (IOException e) {
if (isRollbackSupported(state)) {
setFailure("master-disable-table", e);
} else {
- LOG.warn("Retriable error trying to disable table=" + tableName +
- " (in state=" + state + ")", e);
+ LOG.warn("Retriable error trying to disable table={} (in state={})", tableName, state, e);
}
}
return Flow.HAS_MORE_STATE;