Search in sources :

Example 1 with TransitionCode

use of org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode in project hbase by apache.

the class AssignmentManager method onRegionTransition.

/**
   * Try to update some region states. If the state machine prevents
   * such update, an error message is returned to explain the reason.
   *
   * It's expected that in each transition there should have just one
   * region for opening/closing, 3 regions for splitting/merging.
   * These regions should be on the server that requested the change.
   *
   * Region state machine. Only these transitions
   * are expected to be triggered by a region server.
   *
   * On the state transition:
   *  (1) Open/Close should be initiated by master
   *      (a) Master sets the region to pending_open/pending_close
   *        in memory and hbase:meta after sending the request
   *        to the region server
   *      (b) Region server reports back to the master
   *        after open/close is done (either success/failure)
   *      (c) If region server has problem to report the status
   *        to master, it must be because the master is down or some
   *        temporary network issue. Otherwise, the region server should
   *        abort since it must be a bug. If the master is not accessible,
   *        the region server should keep trying until the server is
   *        stopped or till the status is reported to the (new) master
   *      (d) If region server dies in the middle of opening/closing
   *        a region, SSH picks it up and finishes it
   *      (e) If master dies in the middle, the new master recovers
   *        the state during initialization from hbase:meta. Region server
   *        can report any transition that has not been reported to
   *        the previous active master yet
   *  (2) Split/merge is initiated by region servers
   *      (a) To split a region, a region server sends a request
   *        to master to try to set a region to splitting, together with
   *        two daughters (to be created) to splitting new. If approved
   *        by the master, the splitting can then move ahead
   *      (b) To merge two regions, a region server sends a request to
   *        master to try to set the new merged region (to be created) to
   *        merging_new, together with two regions (to be merged) to merging.
   *        If it is ok with the master, the merge can then move ahead
   *      (c) Once the splitting/merging is done, the region server
   *        reports the status back to the master either success/failure.
   *      (d) Other scenarios should be handled similarly as for
   *        region open/close
   */
public String onRegionTransition(final ServerName serverName, final RegionStateTransition transition) {
    TransitionCode code = transition.getTransitionCode();
    HRegionInfo hri = HRegionInfo.convert(transition.getRegionInfo(0));
    Lock lock = locker.acquireLock(hri.getEncodedName());
    try {
        RegionState current = regionStates.getRegionState(hri);
        if (LOG.isDebugEnabled()) {
            LOG.debug("Got transition " + code + " for " + (current != null ? current.toString() : hri.getShortNameToLog()) + " from " + serverName);
        }
        String errorMsg = null;
        switch(code) {
            case OPENED:
                errorMsg = onRegionOpen(current, hri, serverName, transition);
                break;
            case FAILED_OPEN:
                errorMsg = onRegionFailedOpen(current, hri, serverName);
                break;
            case CLOSED:
                errorMsg = onRegionClosed(current, hri, serverName);
                break;
            case READY_TO_SPLIT:
                try {
                    regionStateListener.onRegionSplit(hri);
                    errorMsg = onRegionReadyToSplit(current, hri, serverName, transition);
                } catch (IOException exp) {
                    if (exp instanceof QuotaExceededException) {
                        server.getRegionNormalizer().planSkipped(hri, PlanType.SPLIT);
                    }
                    errorMsg = StringUtils.stringifyException(exp);
                }
                break;
            case SPLIT_PONR:
                errorMsg = onRegionSplitPONR(current, hri, serverName, transition);
                break;
            case SPLIT:
                errorMsg = onRegionSplit(current, hri, serverName, transition);
                break;
            case SPLIT_REVERTED:
                errorMsg = onRegionSplitReverted(current, hri, serverName, transition);
                if (org.apache.commons.lang.StringUtils.isEmpty(errorMsg)) {
                    try {
                        regionStateListener.onRegionSplitReverted(hri);
                    } catch (IOException exp) {
                        LOG.warn(StringUtils.stringifyException(exp));
                    }
                }
                break;
            case READY_TO_MERGE:
                errorMsg = onRegionReadyToMerge(current, hri, serverName, transition);
                break;
            case MERGE_PONR:
                errorMsg = onRegionMergePONR(current, hri, serverName, transition);
                break;
            case MERGED:
                try {
                    errorMsg = onRegionMerged(current, hri, serverName, transition);
                    regionStateListener.onRegionMerged(hri);
                } catch (IOException exp) {
                    errorMsg = StringUtils.stringifyException(exp);
                }
                break;
            case MERGE_REVERTED:
                errorMsg = onRegionMergeReverted(current, hri, serverName, transition);
                break;
            default:
                errorMsg = "Unexpected transition code " + code;
        }
        if (errorMsg != null) {
            LOG.info("Could not transition region from " + current + " on " + code + " by " + serverName + ": " + errorMsg);
        }
        return errorMsg;
    } finally {
        lock.unlock();
    }
}
Also used : HRegionInfo(org.apache.hadoop.hbase.HRegionInfo) QuotaExceededException(org.apache.hadoop.hbase.quotas.QuotaExceededException) TransitionCode(org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode) HBaseIOException(org.apache.hadoop.hbase.HBaseIOException) IOException(java.io.IOException) ReentrantLock(java.util.concurrent.locks.ReentrantLock) Lock(java.util.concurrent.locks.Lock)

Example 2 with TransitionCode

use of org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode in project hbase by apache.

the class HRegionServer method skipReportingTransition.

/**
 * Helper method for use in tests. Skip the region transition report when there's no master
 * around to receive it.
 */
private boolean skipReportingTransition(final RegionStateTransitionContext context) {
    final TransitionCode code = context.getCode();
    final long openSeqNum = context.getOpenSeqNum();
    long masterSystemTime = context.getMasterSystemTime();
    final RegionInfo[] hris = context.getHris();
    if (code == TransitionCode.OPENED) {
        Preconditions.checkArgument(hris != null && hris.length == 1);
        if (hris[0].isMetaRegion()) {
            LOG.warn("meta table location is stored in master local store, so we can not skip reporting");
            return false;
        } else {
            try {
                MetaTableAccessor.updateRegionLocation(asyncClusterConnection.toConnection(), hris[0], serverName, openSeqNum, masterSystemTime);
            } catch (IOException e) {
                LOG.info("Failed to update meta", e);
                return false;
            }
        }
    }
    return true;
}
Also used : TransitionCode(org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode) RegionInfo(org.apache.hadoop.hbase.client.RegionInfo) IOException(java.io.IOException) DoNotRetryIOException(org.apache.hadoop.hbase.DoNotRetryIOException)

Example 3 with TransitionCode

use of org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode in project hbase by apache.

the class HRegionServer method createReportRegionStateTransitionRequest.

private ReportRegionStateTransitionRequest createReportRegionStateTransitionRequest(final RegionStateTransitionContext context) {
    final TransitionCode code = context.getCode();
    final long openSeqNum = context.getOpenSeqNum();
    final RegionInfo[] hris = context.getHris();
    final long[] procIds = context.getProcIds();
    ReportRegionStateTransitionRequest.Builder builder = ReportRegionStateTransitionRequest.newBuilder();
    builder.setServer(ProtobufUtil.toServerName(serverName));
    RegionStateTransition.Builder transition = builder.addTransitionBuilder();
    transition.setTransitionCode(code);
    if (code == TransitionCode.OPENED && openSeqNum >= 0) {
        transition.setOpenSeqNum(openSeqNum);
    }
    for (RegionInfo hri : hris) {
        transition.addRegionInfo(ProtobufUtil.toRegionInfo(hri));
    }
    for (long procId : procIds) {
        transition.addProcId(procId);
    }
    return builder.build();
}
Also used : TransitionCode(org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode) ReportRegionStateTransitionRequest(org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest) RegionInfo(org.apache.hadoop.hbase.client.RegionInfo) RegionStateTransition(org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition)

Aggregations

TransitionCode (org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode)3 IOException (java.io.IOException)2 RegionInfo (org.apache.hadoop.hbase.client.RegionInfo)2 Lock (java.util.concurrent.locks.Lock)1 ReentrantLock (java.util.concurrent.locks.ReentrantLock)1 DoNotRetryIOException (org.apache.hadoop.hbase.DoNotRetryIOException)1 HBaseIOException (org.apache.hadoop.hbase.HBaseIOException)1 HRegionInfo (org.apache.hadoop.hbase.HRegionInfo)1 QuotaExceededException (org.apache.hadoop.hbase.quotas.QuotaExceededException)1 RegionStateTransition (org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition)1 ReportRegionStateTransitionRequest (org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest)1