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}