001/** 002 * 003 * Licensed to the Apache Software Foundation (ASF) under one 004 * or more contributor license agreements. See the NOTICE file 005 * distributed with this work for additional information 006 * regarding copyright ownership. The ASF licenses this file 007 * to you under the Apache License, Version 2.0 (the 008 * "License"); you may not use this file except in compliance 009 * with the License. You may obtain a copy of the License at 010 * 011 * http://www.apache.org/licenses/LICENSE-2.0 012 * 013 * Unless required by applicable law or agreed to in writing, software 014 * distributed under the License is distributed on an "AS IS" BASIS, 015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 016 * See the License for the specific language governing permissions and 017 * limitations under the License. 018 */ 019 020package org.apache.hadoop.hbase.master.assignment; 021 022import java.io.IOException; 023import java.util.Optional; 024 025import org.apache.hadoop.hbase.ServerName; 026import org.apache.hadoop.hbase.exceptions.UnexpectedStateException; 027import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv; 028import org.apache.hadoop.hbase.procedure2.ProcedureMetrics; 029import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer; 030import org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.RemoteOperation; 031import org.apache.yetus.audience.InterfaceAudience; 032 033import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; 034import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionTransitionState; 035import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.UnassignRegionStateData; 036import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode; 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 class UnassignProcedure extends RegionTransitionProcedure { 046 047 protected volatile ServerName hostingServer; 048 049 protected volatile ServerName destinationServer; 050 051 private boolean removeAfterUnassigning; 052 053 public UnassignProcedure() { 054 } 055 056 @Override 057 public TableOperationType getTableOperationType() { 058 return TableOperationType.REGION_UNASSIGN; 059 } 060 061 @Override 062 protected boolean isRollbackSupported(final RegionTransitionState state) { 063 switch (state) { 064 case REGION_TRANSITION_QUEUE: 065 case REGION_TRANSITION_DISPATCH: 066 return true; 067 default: 068 return false; 069 } 070 } 071 072 @Override 073 protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException { 074 UnassignRegionStateData.Builder state = 075 UnassignRegionStateData.newBuilder().setTransitionState(getTransitionState()) 076 .setHostingServer(ProtobufUtil.toServerName(this.hostingServer)) 077 .setRegionInfo(ProtobufUtil.toRegionInfo(getRegionInfo())); 078 if (this.destinationServer != null) { 079 state.setDestinationServer(ProtobufUtil.toServerName(destinationServer)); 080 } 081 if (removeAfterUnassigning) { 082 state.setRemoveAfterUnassigning(true); 083 } 084 if (getAttempt() > 0) { 085 state.setAttempt(getAttempt()); 086 } 087 serializer.serialize(state.build()); 088 } 089 090 @Override 091 protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException { 092 final UnassignRegionStateData state = serializer.deserialize(UnassignRegionStateData.class); 093 setTransitionState(state.getTransitionState()); 094 setRegionInfo(ProtobufUtil.toRegionInfo(state.getRegionInfo())); 095 this.hostingServer = ProtobufUtil.toServerName(state.getHostingServer()); 096 if (state.hasDestinationServer()) { 097 this.destinationServer = ProtobufUtil.toServerName(state.getDestinationServer()); 098 } 099 removeAfterUnassigning = state.getRemoveAfterUnassigning(); 100 if (state.hasAttempt()) { 101 setAttempt(state.getAttempt()); 102 } 103 } 104 105 @Override 106 protected boolean startTransition(final MasterProcedureEnv env, 107 final RegionStateNode regionNode) { 108 // nothing to do here. we skip the step in the constructor 109 // by jumping to REGION_TRANSITION_DISPATCH 110 throw new UnsupportedOperationException(); 111 } 112 113 @Override 114 protected boolean updateTransition(final MasterProcedureEnv env, final RegionStateNode regionNode) 115 throws IOException { 116 return true; 117 } 118 119 @Override 120 protected void finishTransition(final MasterProcedureEnv env, final RegionStateNode regionNode) 121 throws IOException { 122 } 123 124 @Override 125 public Optional<RemoteOperation> remoteCallBuild(final MasterProcedureEnv env, 126 final ServerName serverName) { 127 return Optional.empty(); 128 } 129 130 @Override 131 protected void reportTransition(final MasterProcedureEnv env, final RegionStateNode regionNode, 132 final TransitionCode code, final long seqId) throws UnexpectedStateException { 133 } 134 135 /** 136 * @return If true, we will re-wake up this procedure; if false, the procedure stays suspended. 137 */ 138 @Override 139 protected boolean remoteCallFailed(final MasterProcedureEnv env, final RegionStateNode regionNode, 140 final IOException exception) { 141 return true; 142 } 143 144 @Override 145 public void toStringClassDetails(StringBuilder sb) { 146 super.toStringClassDetails(sb); 147 sb.append(", server=").append(this.hostingServer); 148 } 149 150 @Override 151 protected ProcedureMetrics getProcedureMetrics(MasterProcedureEnv env) { 152 return env.getAssignmentManager().getAssignmentManagerMetrics().getUnassignProcMetrics(); 153 } 154}