apache/cassandra · error · IllegalArgumentException
Sequence of kind is in progress for node . Cannot proceed…
Error message
Sequence of kind ${kind} is in progress for node ${nodeIpOrId}. Cannot proceed with this operation. What it means
CMSOfflineTool aborts an in-progress multi-step operation (e.g. JOIN/REPLACE/MOVE) against a node, but only for sequence kinds it supports cancelling. If ClusterMetadata shows a sequence of an unsupported kind in progress for the target node, it throws this IllegalArgumentException because an offline cancel of that kind is not implemented.
Solutions
- Check the in-progress sequence kind with a live nodetool/cms command instead of the offline tool, and complete or abort it through the supported online path.
- Complete the sequence on the live cluster (e.g. finish the bootstrap/move) before running the offline tool.
- Hand-edit or regenerate the cluster metadata so no unsupported sequence is registered for the node (only in a controlled recovery scenario).
Example fix
// before
throw new IllegalArgumentException("Sequence of kind " + multiStepOperation.kind() + " is in progress for node " + nodeIdentifierOption.getNodeIpOrId() + ". Cannot proceed with this operation.");
// after
// no code fix; operator must clear the sequence via the supported online path first Defensive patterns
Strategy: validation
Validate before calling
ClusterMetadata meta = /* loaded metadata */;
NodeId nodeId = /* resolved node */;
MultiStepOperation<?> op = meta.inProgressSequences.get(nodeId);
if (op != null && !SUPPORTED_CANCEL_KINDS.contains(op.kind()))
throw new IllegalStateException("Unsupported in-progress sequence " + op.kind() + " for " + nodeId + "; clear it online first"); Try / catch
try { tool.abort(nodeId); } catch (IllegalArgumentException e) { if (e.getMessage().contains("Sequence of kind")) { /* complete/cancel sequence online, then retry */ } else throw e; } Prevention
- Check in-progress sequences for the node before running offline abort.
- Keep offline metadata snapshots fresh; stale snapshots hide sequence state changes.
- Prefer online nodetool/cms flows to clear sequences before offline recovery.
When it happens
Trigger: Running a CMSOfflineTool abort/cancel operation via `execute` when metadata.inProgressSequences contains an entry for the node whose kind() is not in supportedKinds() (checked after fetching the in-progress MultiStepOperation).
Common situations: Operator runs the offline tool while the node has a non-cancellable sequence (e.g. a bootstrap or relocation kind not on the supported list); stale ClusterMetadata snapshot taken from the offline metadata file still references an old 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
- Another sequence of kind
- Cannot assassinate the node when sequence of kind
- Node is not a CMS member in epoch ; members=
- All nodes are not yet upgraded
- Another sequence of kind
AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10).
Data as JSON: /api/errors/bc5a8736cad5d234.
Report an issue: GitHub.
Appendix: source
Thrown at src/java/org/apache/cassandra/tools/CMSOfflineTool.java:264
return metadata;
}
@Override
protected void execute(Output output) throws IOException
{
ClusterMetadata metadata = parseClusterMetadata();
NodeId nodeId = nodeIdentifierOption.getNodeId(metadata);
MultiStepOperation<?> multiStepOperation = metadata.inProgressSequences.get(nodeId);
if (multiStepOperation == null)
{
throw new IllegalArgumentException("No transformation sequence is in progress for " +
nodeIdentifierOption.getNodeIpOrId() + '.');
}
if (!supportedKinds().contains(multiStepOperation.kind()))
{
throw new IllegalArgumentException("Sequence of kind " + multiStepOperation.kind() +
" is in progress for node " + nodeIdentifierOption.getNodeIpOrId() +
". Cannot proceed with this operation.");
}
CancelInProgressSequence cancelSequence = new CancelInProgressSequence(nodeId);
ClusterMetadata updatedMetadata = cancelSequence.execute(metadata).success().metadata;
updatedMetadata = postCancel(updatedMetadata, nodeId);
writeMetadata(output, updatedMetadata, outputFilePath);
}
}
/**
* Cancels a JOIN or REPLACE bootstrap sequence for the given node and unregisters it
* from the cluster. Use this when a node is stuck in bootstrapping or replacement.
* Fails if no in-progress sequence exists, or if the sequence is not of kind JOIN or REPLACE.
*/
@Command(name = "abortbootstrap",
description = "Aborts bootstrap for given node if in progress.")View on GitHub (pinned to 88fd0f6a0e)