HBASE-20659 Implement a reopen table regions procedure
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/99774707 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/99774707 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/99774707 Branch: refs/heads/HBASE-19064 Commit: 997747076d8ec0b4346d7cb99c4b0667a7c14905 Parents: 63726f1 Author: zhangduo <zhang...@apache.org> Authored: Wed May 30 15:33:29 2018 +0800 Committer: zhangduo <zhang...@apache.org> Committed: Wed May 30 20:03:25 2018 +0800 ---------------------------------------------------------------------- .../hbase/procedure2/StateMachineProcedure.java | 11 +- .../src/main/protobuf/MasterProcedure.proto | 8 ++ .../procedure/ReopenTableRegionsProcedure.java | 114 +++++++++++++++++++ .../master/replication/ModifyPeerProcedure.java | 4 +- 4 files changed, 132 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/99774707/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.java ---------------------------------------------------------------------- diff --git a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.java b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.java index 0e3a4cd..69ecb29 100644 --- a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.java +++ b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.java @@ -142,10 +142,15 @@ public abstract class StateMachineProcedure<TEnvironment, TState> * Add a child procedure to execute * @param subProcedure the child procedure */ - protected void addChildProcedure(Procedure<TEnvironment>... subProcedure) { - if (subProcedure == null) return; + protected <T extends Procedure<TEnvironment>> void addChildProcedure( + @SuppressWarnings("unchecked") T... subProcedure) { + if (subProcedure == null) { + return; + } final int len = subProcedure.length; - if (len == 0) return; + if (len == 0) { + return; + } if (subProcList == null) { subProcList = new ArrayList<>(len); } http://git-wip-us.apache.org/repos/asf/hbase/blob/99774707/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 17a81cd..b65551f 100644 --- a/hbase-protocol-shaded/src/main/protobuf/MasterProcedure.proto +++ b/hbase-protocol-shaded/src/main/protobuf/MasterProcedure.proto @@ -437,3 +437,11 @@ message EnablePeerStateData { message DisablePeerStateData { } + +enum ReopenTableRegionsState { + REOPEN_TABLE_REGIONS_REOPEN_ALL_REGIONS = 1; +} + +message ReopenTableRegionsStateData { + required TableName table_name = 1; +} http://git-wip-us.apache.org/repos/asf/hbase/blob/99774707/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.java new file mode 100644 index 0000000..133d6f4 --- /dev/null +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.java @@ -0,0 +1,114 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hbase.master.procedure; + +import java.io.IOException; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer; +import org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException; +import org.apache.hadoop.hbase.procedure2.ProcedureYieldException; +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.ReopenTableRegionsState; +import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsStateData; + +/** + * Used for non table procedures to reopen the regions for a table. For example, + * {@link org.apache.hadoop.hbase.master.replication.ModifyPeerProcedure}. + */ +@InterfaceAudience.Private +public class ReopenTableRegionsProcedure + extends AbstractStateMachineTableProcedure<ReopenTableRegionsState> { + + private static final Logger LOG = LoggerFactory.getLogger(ReopenTableRegionsProcedure.class); + + private TableName tableName; + + public ReopenTableRegionsProcedure() { + } + + public ReopenTableRegionsProcedure(TableName tableName) { + this.tableName = tableName; + } + + @Override + public TableName getTableName() { + return tableName; + } + + @Override + public TableOperationType getTableOperationType() { + return TableOperationType.REGION_EDIT; + } + + @Override + protected Flow executeFromState(MasterProcedureEnv env, ReopenTableRegionsState state) + throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException { + switch (state) { + case REOPEN_TABLE_REGIONS_REOPEN_ALL_REGIONS: + try { + addChildProcedure(env.getAssignmentManager().createReopenProcedures( + env.getAssignmentManager().getRegionStates().getRegionsOfTable(tableName))); + } catch (IOException e) { + LOG.warn("Failed to schedule reopen procedures for {}", tableName, e); + throw new ProcedureSuspendedException(); + } + return Flow.NO_MORE_STATE; + default: + throw new UnsupportedOperationException("unhandled state=" + state); + } + } + + @Override + protected void rollbackState(MasterProcedureEnv env, ReopenTableRegionsState state) + throws IOException, InterruptedException { + throw new UnsupportedOperationException(); + } + + @Override + protected ReopenTableRegionsState getState(int stateId) { + return ReopenTableRegionsState.forNumber(stateId); + } + + @Override + protected int getStateId(ReopenTableRegionsState state) { + return state.getNumber(); + } + + @Override + protected ReopenTableRegionsState getInitialState() { + return ReopenTableRegionsState.REOPEN_TABLE_REGIONS_REOPEN_ALL_REGIONS; + } + + @Override + protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException { + super.serializeStateData(serializer); + serializer.serialize(ReopenTableRegionsStateData.newBuilder() + .setTableName(ProtobufUtil.toProtoTableName(tableName)).build()); + } + + @Override + protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException { + super.deserializeStateData(serializer); + tableName = ProtobufUtil + .toTableName(serializer.deserialize(ReopenTableRegionsStateData.class).getTableName()); + } +} http://git-wip-us.apache.org/repos/asf/hbase/blob/99774707/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.java index ea2e314..6fd8aa3 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ModifyPeerProcedure.java @@ -30,6 +30,7 @@ import org.apache.hadoop.hbase.master.TableStateManager; import org.apache.hadoop.hbase.master.TableStateManager.TableStateNotFoundException; import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv; import org.apache.hadoop.hbase.master.procedure.ProcedurePrepareLatch; +import org.apache.hadoop.hbase.master.procedure.ReopenTableRegionsProcedure; import org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException; import org.apache.hadoop.hbase.procedure2.ProcedureYieldException; import org.apache.hadoop.hbase.replication.ReplicationException; @@ -165,8 +166,7 @@ public abstract class ModifyPeerProcedure extends AbstractPeerProcedure<PeerModi continue; } if (needReopen(tsm, tn)) { - addChildProcedure(env.getAssignmentManager().createReopenProcedures( - env.getAssignmentManager().getRegionStates().getRegionsOfTable(tn))); + addChildProcedure(new ReopenTableRegionsProcedure(tn)); } } }