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.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionTransitionState; 035import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode; 036import org.apache.yetus.audience.InterfaceAudience; 037 038/** 039 * Leave here only for checking if we can successfully start the master. 040 * @deprecated Do not use any more. 041 * @see TransitRegionStateProcedure 042 */ 043@Deprecated 044@InterfaceAudience.Private 045public abstract class RegionTransitionProcedure extends Procedure<MasterProcedureEnv> 046 implements TableProcedureInterface, RemoteProcedure<MasterProcedureEnv, ServerName> { 047 048 protected final AtomicBoolean aborted = new AtomicBoolean(false); 049 050 private RegionTransitionState transitionState = RegionTransitionState.REGION_TRANSITION_QUEUE; 051 052 private RegionInfo regionInfo; 053 054 private int attempt; 055 056 // Required by the Procedure framework to create the procedure on replay 057 public RegionTransitionProcedure() { 058 } 059 060 public RegionTransitionProcedure(final RegionInfo regionInfo) { 061 this.regionInfo = regionInfo; 062 } 063 064 public RegionInfo getRegionInfo() { 065 return regionInfo; 066 } 067 068 public void setRegionInfo(final RegionInfo regionInfo) { 069 this.regionInfo = regionInfo; 070 } 071 072 protected void setAttempt(int attempt) { 073 this.attempt = attempt; 074 } 075 076 protected int getAttempt() { 077 return this.attempt; 078 } 079 080 @Override 081 public TableName getTableName() { 082 RegionInfo hri = getRegionInfo(); 083 return hri != null ? hri.getTable() : null; 084 } 085 086 public boolean isMeta() { 087 return TableName.isMetaTableName(getTableName()); 088 } 089 090 @Override 091 public void toStringClassDetails(final StringBuilder sb) { 092 sb.append(getProcName()); 093 } 094 095 @Override public String getProcName() { 096 RegionInfo r = getRegionInfo(); 097 return getClass().getSimpleName() + " " + getTableName() + (r != null? r.getEncodedName(): ""); 098 } 099 100 public RegionStateNode getRegionState(final MasterProcedureEnv env) { 101 return env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(getRegionInfo()); 102 } 103 104 void setTransitionState(final RegionTransitionState state) { 105 this.transitionState = state; 106 } 107 108 RegionTransitionState getTransitionState() { 109 return transitionState; 110 } 111 112 protected abstract boolean startTransition(MasterProcedureEnv env, RegionStateNode regionNode) 113 throws IOException, ProcedureSuspendedException; 114 115 protected abstract boolean updateTransition(MasterProcedureEnv env, RegionStateNode regionNode) 116 throws IOException, ProcedureSuspendedException; 117 118 protected abstract void finishTransition(MasterProcedureEnv env, RegionStateNode regionNode) 119 throws IOException, ProcedureSuspendedException; 120 121 protected abstract void reportTransition(MasterProcedureEnv env, RegionStateNode regionNode, 122 TransitionCode code, long seqId) throws UnexpectedStateException; 123 124 @Override 125 public abstract Optional<RemoteOperation> remoteCallBuild(MasterProcedureEnv env, 126 ServerName serverName); 127 128 protected abstract boolean remoteCallFailed(MasterProcedureEnv env, RegionStateNode regionNode, 129 IOException exception); 130 131 @Override 132 public synchronized void remoteCallFailed(final MasterProcedureEnv env, 133 final ServerName serverName, final IOException exception) { 134 } 135 136 @Override 137 protected void toStringState(StringBuilder builder) { 138 super.toStringState(builder); 139 RegionTransitionState ts = this.transitionState; 140 if (!isFinished() && ts != null) { 141 builder.append(":").append(ts); 142 } 143 } 144 145 @Override 146 protected Procedure[] execute(final MasterProcedureEnv env) { 147 return null; 148 } 149 150 @Override 151 protected void rollback(MasterProcedureEnv env) { 152 } 153 154 protected abstract boolean isRollbackSupported(final RegionTransitionState state); 155 156 @Override 157 protected boolean abort(final MasterProcedureEnv env) { 158 if (isRollbackSupported(transitionState)) { 159 aborted.set(true); 160 return true; 161 } 162 return false; 163 } 164 165 @Override 166 public void remoteOperationCompleted(MasterProcedureEnv env) { 167 // should not be called for region operation until we modified the open/close region procedure 168 throw new UnsupportedOperationException(); 169 } 170 171 @Override 172 public void remoteOperationFailed(MasterProcedureEnv env, RemoteProcedureException error) { 173 // should not be called for region operation until we modified the open/close region procedure 174 throw new UnsupportedOperationException(); 175 } 176 177}