apache/cassandra · error · RuntimeException

Can't abort bootstrap for node since the state is

Error message

Can't abort bootstrap for node  since the state is 

What it means

Thrown by StorageService.abortBootstrap when the node's peer state is not one of REGISTERED, BOOTSTRAPPING, or BOOT_REPLACING - the only states from which a bootstrap can be aborted. The node is for example NORMAL (a full member), LEFT, or in some other lifecycle state, so aborting a bootstrap makes no sense.

Source

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

        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);
            }
            catch (IllegalArgumentException | UnsupportedOperationException e)
            {
                String msg = "Unable to parse node id string " + nodeStr;
                logger.warn("{}", msg, e);
                throw new IllegalArgumentException(msg, e);
            }

View on GitHub (pinned to 88fd0f6a0e)

Solutions

  1. Check the node state with `nodetool gossipinfo` or cluster metadata - if it is NORMAL, the bootstrap finished and no abort is needed
  2. If you want to remove a joined node, use `nodetool decommission` (on the node) or the appropriate removenode/assassinate flow instead
  3. Verify the NodeId/host id - you may be targeting a different node than intended
  4. If the node is stuck in an unexpected state, consult the state value in the message and follow the matching lifecycle operation

Example fix

// before
nodetool abortbootstrap <id-of-NORMAL-node>
// after
nodetool status          # confirm state
# node already joined:
nodetool decommission    # on the node to remove
# or for a dead member: nodetool removenode <host-id>
Defensive patterns

Strategy: validation

Validate before calling

// Only call abortbootstrap for nodes in REGISTERED/BOOTSTRAPPING/BOOT_REPLACING state
// Check `nodetool gossipinfo` / status first; if state is NORMAL use decommission instead.

Try / catch

try {
    probe.abortBootstrap(nodeId);
} catch (RuntimeException e) {
    if (e.getMessage().contains("since the state is"))
        log.warn("Node not bootstrapping; pick the lifecycle op matching its state (decommission/removenode)");
    else throw e;
}

Prevention

When it happens

Trigger: Running `nodetool abortbootstrap <node>` for a node that already completed its join (state NORMAL), was decommissioned, or never was bootstrapping; specifying the wrong node id/address.

Common situations: Operator aborts against the wrong node (typo or picked the wrong host id); trying to remove a fully-joined node (should use decommission instead); retrying abort after bootstrap already succeeded.

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/c60593aa9bcbc7af. Report an issue: GitHub.