apache/cassandra · error · RuntimeException

Can't abort bootstrap for since it is not bootstrapping

Error message

Can't abort bootstrap for  since it is not bootstrapping

What it means

Thrown by StorageService.abortBootstrap when the node's directory state is REGISTERED/BOOTSTRAPPING/BOOT_REPLACING and an in-progress sequence exists for it, but that sequence's kind is neither JOIN nor REPLACE - i.e. the tracked operation is not actually a bootstrap, so cancelling it as one is refused.

Source

Thrown at src/java/org/apache/cassandra/service/StorageService.java:1684

        logger.info("Aborting bootstrap for {}", StringUtils.isEmpty(nodeStr) ? endpointStr : nodeStr);
        ClusterMetadata metadata = ClusterMetadata.current();
        NodeId nodeId = parseNodeIdOrEndpoint(metadata, nodeStr, endpointStr);
        InetAddressAndPort endpoint = metadata.directory.endpoint(nodeId);
        if (endpoint == null)
            throw new IllegalArgumentException("Can't abort bootstrap for " + nodeId + " - it does not exist in cluster metadata");
        if (Gossiper.instance.isKnownEndpoint(endpoint) && FailureDetector.instance.isAlive(endpoint))
            throw new RuntimeException("Can't abort bootstrap for " + nodeId + " - it is alive");
        NodeState nodeState = metadata.directory.peerState(nodeId);
        switch (nodeState)
        {
            case REGISTERED:
            case BOOTSTRAPPING:
            case BOOT_REPLACING:
                if (metadata.inProgressSequences.contains(nodeId))
                {
                    MultiStepOperation<?> seq = metadata.inProgressSequences.get(nodeId);
                    if (seq.kind() != MultiStepOperation.Kind.JOIN && seq.kind() != MultiStepOperation.Kind.REPLACE)
                        throw new RuntimeException("Can't abort bootstrap for " + nodeId + " since it is not bootstrapping");
                    ClusterMetadataService.instance().commit(new CancelInProgressSequence(nodeId));
                }
                ClusterMetadataService.instance().commit(new Unregister(nodeId, EnumSet.of(REGISTERED, BOOTSTRAPPING, BOOT_REPLACING), ClusterMetadataService.instance().placementProvider()));
                break;
            default:
                throw new RuntimeException("Can't abort bootstrap for node " + nodeId + " since the state is " + nodeState);
        }
    }

    private static NodeId parseNodeIdOrEndpoint(ClusterMetadata metadata, String nodeStr, String endpointStr)
    {
        NodeId nodeId;
        if (!StringUtils.isEmpty(nodeStr))
        {
            try
            {
                nodeId = NodeId.fromString(nodeStr);
            }

View on GitHub (pinned to 88fd0f6a0e)

Solutions

  1. Inspect the in-progress sequence kind (ClusterMetadata inProgressSequences) and use the correct abort/cancel command for that operation kind
  2. If the sequence is stale/corrupted, restart the node so the sequence is rebuilt or completes, then retry
  3. Use the operation-specific cancel path (e.g. cancel the rebuild) instead of abortbootstrap
  4. File/consult CASSANDRA issues if the state seems inconsistent - this may indicate metadata inconsistency requiring operator cleanup
Defensive patterns

Strategy: validation

Validate before calling

// Confirm the in-progress sequence is a JOIN/REPLACE before aborting
// Inspect ClusterMetadata inProgressSequences for the node; only call abortbootstrap
// when kind is JOIN or REPLACE, otherwise use the operation-specific cancel.

Try / catch

try {
    probe.abortBootstrap(nodeId);
} catch (RuntimeException e) {
    if (e.getMessage().contains("since it is not bootstrapping"))
        log.warn("In-progress sequence is not JOIN/REPLACE; use the matching cancel operation");
    else throw e;
}

Prevention

When it happens

Trigger: Aborting a node whose inProgressSequences entry is a different multi-step operation kind (e.g. a REBUILD or other MultiStepOperation) while its peer state still reads BOOTSTRAPPING.

Common situations: Node previously completed a bootstrap and is now running a different streaming operation; operator confuses rebuild/repair operations with bootstrap; state left from a partially-cancelled sequence.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10). Data as JSON: /api/errors/383219b8a314fe9e. Report an issue: GitHub.