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

  1. 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.
  2. Complete the sequence on the live cluster (e.g. finish the bootstrap/move) before running the offline tool.
  3. 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

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


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)