Search in sources :

Example 1 with UnexpectedStateException

use of org.apache.hadoop.hbase.exceptions.UnexpectedStateException in project hbase by apache.

the class AssignmentManager method updateRegionSplitTransition.

private void updateRegionSplitTransition(final ServerName serverName, final TransitionCode state, final RegionInfo parent, final RegionInfo hriA, final RegionInfo hriB) throws IOException {
    checkMetaLoaded(parent);
    if (state != TransitionCode.READY_TO_SPLIT) {
        throw new UnexpectedStateException("unsupported split regionState=" + state + " for parent region " + parent + " maybe an old RS (< 2.0) had the operation in progress");
    }
    // sanity check on the request
    if (!Bytes.equals(hriA.getEndKey(), hriB.getStartKey())) {
        throw new UnsupportedOperationException("unsupported split request with bad keys: parent=" + parent + " hriA=" + hriA + " hriB=" + hriB);
    }
    if (!master.isSplitOrMergeEnabled(MasterSwitchType.SPLIT)) {
        LOG.warn("Split switch is off! skip split of " + parent);
        throw new DoNotRetryIOException("Split region " + parent.getRegionNameAsString() + " failed due to split switch off");
    }
    // Submit the Split procedure
    final byte[] splitKey = hriB.getStartKey();
    if (LOG.isDebugEnabled()) {
        LOG.debug("Split request from " + serverName + ", parent=" + parent + " splitKey=" + Bytes.toStringBinary(splitKey));
    }
    // Processing this report happens asynchronously from other activities which can mutate
    // the region state. For example, a split procedure may already be running for this parent.
    // A split procedure cannot succeed if the parent region is no longer open, so we can
    // ignore it in that case.
    // Note that submitting more than one split procedure for a given region is
    // harmless -- the split is fenced in the procedure handling -- but it would be noisy in
    // the logs. Only one procedure can succeed. The other procedure(s) would abort during
    // initialization and report failure with WARN level logging.
    RegionState parentState = regionStates.getRegionState(parent);
    if (parentState != null && parentState.isOpened()) {
        master.getMasterProcedureExecutor().submitProcedure(createSplitProcedure(parent, splitKey));
    } else {
        LOG.info("Ignoring split request from " + serverName + ", parent=" + parent + " because parent is unknown or not open");
        return;
    }
    // If the RS is < 2.0 throw an exception to abort the operation, we are handling the split
    if (master.getServerManager().getVersionNumber(serverName) < 0x0200000) {
        throw new UnsupportedOperationException(String.format("Split handled by the master: " + "parent=%s hriA=%s hriB=%s", parent.getShortNameToLog(), hriA, hriB));
    }
}
Also used : RegionState(org.apache.hadoop.hbase.master.RegionState) DoNotRetryIOException(org.apache.hadoop.hbase.DoNotRetryIOException) UnexpectedStateException(org.apache.hadoop.hbase.exceptions.UnexpectedStateException)

Aggregations

DoNotRetryIOException (org.apache.hadoop.hbase.DoNotRetryIOException)1 UnexpectedStateException (org.apache.hadoop.hbase.exceptions.UnexpectedStateException)1 RegionState (org.apache.hadoop.hbase.master.RegionState)1