001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package org.apache.hadoop.hbase.master.assignment; 019 020import java.io.IOException; 021import java.util.Optional; 022import java.util.concurrent.atomic.AtomicBoolean; 023import org.apache.hadoop.hbase.ServerName; 024import org.apache.hadoop.hbase.TableName; 025import org.apache.hadoop.hbase.client.RegionInfo; 026import org.apache.hadoop.hbase.exceptions.UnexpectedStateException; 027import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv; 028import org.apache.hadoop.hbase.master.procedure.TableProcedureInterface; 029import org.apache.hadoop.hbase.procedure2.Procedure; 030import org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException; 031import org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.RemoteOperation; 032import org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.RemoteProcedure; 033import org.apache.hadoop.hbase.procedure2.RemoteProcedureException; 034import org.apache.yetus.audience.InterfaceAudience; 035import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting; 036import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionTransitionState; 037import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode; 038 039/** 040 * Leave here only for checking if we can successfully start the master. 041 * @deprecated Do not use any more. 042 * @see TransitRegionStateProcedure 043 */ 044@Deprecated 045@InterfaceAudience.Private 046public abstract class RegionTransitionProcedure extends Procedure<MasterProcedureEnv> 047 implements TableProcedureInterface, RemoteProcedure<MasterProcedureEnv, ServerName> { 048 049 protected final AtomicBoolean aborted = new AtomicBoolean(false); 050 051 private RegionTransitionState transitionState = RegionTransitionState.REGION_TRANSITION_QUEUE; 052 053 private RegionInfo regionInfo; 054 055 private int attempt; 056 057 // Required by the Procedure framework to create the procedure on replay 058 public RegionTransitionProcedure() { 059 } 060 061 public RegionTransitionProcedure(final RegionInfo regionInfo) { 062 this.regionInfo = regionInfo; 063 } 064 065 @VisibleForTesting 066 public RegionInfo getRegionInfo() { 067 return regionInfo; 068 } 069 070 @VisibleForTesting 071 public void setRegionInfo(final RegionInfo regionInfo) { 072 this.regionInfo = regionInfo; 073 } 074 075 protected void setAttempt(int attempt) { 076 this.attempt = attempt; 077 } 078 079 protected int getAttempt() { 080 return this.attempt; 081 } 082 083 @Override 084 public TableName getTableName() { 085 RegionInfo hri = getRegionInfo(); 086 return hri != null ? hri.getTable() : null; 087 } 088 089 public boolean isMeta() { 090 return TableName.isMetaTableName(getTableName()); 091 } 092 093 @Override 094 public void toStringClassDetails(final StringBuilder sb) { 095 sb.append(getProcName()); 096 } 097 098 @Override public String getProcName() { 099 RegionInfo r = getRegionInfo(); 100 return getClass().getSimpleName() + " " + getTableName() + (r != null? r.getEncodedName(): ""); 101 } 102 103 public RegionStateNode getRegionState(final MasterProcedureEnv env) { 104 return env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(getRegionInfo()); 105 } 106 107 void setTransitionState(final RegionTransitionState state) { 108 this.transitionState = state; 109 } 110 111 RegionTransitionState getTransitionState() { 112 return transitionState; 113 } 114 115 protected abstract boolean startTransition(MasterProcedureEnv env, RegionStateNode regionNode) 116 throws IOException, ProcedureSuspendedException; 117 118 protected abstract boolean updateTransition(MasterProcedureEnv env, RegionStateNode regionNode) 119 throws IOException, ProcedureSuspendedException; 120 121 protected abstract void finishTransition(MasterProcedureEnv env, RegionStateNode regionNode) 122 throws IOException, ProcedureSuspendedException; 123 124 protected abstract void reportTransition(MasterProcedureEnv env, RegionStateNode regionNode, 125 TransitionCode code, long seqId) throws UnexpectedStateException; 126 127 @Override 128 public abstract Optional<RemoteOperation> remoteCallBuild(MasterProcedureEnv env, 129 ServerName serverName); 130 131 protected abstract boolean remoteCallFailed(MasterProcedureEnv env, RegionStateNode regionNode, 132 IOException exception); 133 134 @Override 135 public synchronized void remoteCallFailed(final MasterProcedureEnv env, 136 final ServerName serverName, final IOException exception) { 137 } 138 139 @Override 140 protected void toStringState(StringBuilder builder) { 141 super.toStringState(builder); 142 RegionTransitionState ts = this.transitionState; 143 if (!isFinished() && ts != null) { 144 builder.append(":").append(ts); 145 } 146 } 147 148 @Override 149 protected Procedure[] execute(final MasterProcedureEnv env) { 150 return null; 151 } 152 153 @Override 154 protected void rollback(MasterProcedureEnv env) { 155 } 156 157 protected abstract boolean isRollbackSupported(final RegionTransitionState state); 158 159 @Override 160 protected boolean abort(final MasterProcedureEnv env) { 161 if (isRollbackSupported(transitionState)) { 162 aborted.set(true); 163 return true; 164 } 165 return false; 166 } 167 168 @Override 169 public void remoteOperationCompleted(MasterProcedureEnv env) { 170 // should not be called for region operation until we modified the open/close region procedure 171 throw new UnsupportedOperationException(); 172 } 173 174 @Override 175 public void remoteOperationFailed(MasterProcedureEnv env, RemoteProcedureException error) { 176 // should not be called for region operation until we modified the open/close region procedure 177 throw new UnsupportedOperationException(); 178 } 179 180}