apache/cassandra · error · IllegalArgumentException

Cannot assassinate the node when sequence of kind

Error message

Cannot assassinate the node when sequence of kind ${sequenceKind} is in progress.

What it means

Generic guard for the assassinate path: when the node has any in-progress sequence kind that the tool cannot cancel and which is not JOIN/REPLACE, it throws this IllegalArgumentException because assassinating a node with that sequence active is unsafe/unsupported.

Solutions

  1. Cancel or complete the in-progress sequence via the appropriate CMSOfflineTool subcommand (e.g. finish/cancel move) before assassinating.
  2. Restart the node and let the sequence resolve, then remove it through decommission.
  3. Manually clear the sequence from cluster metadata only as a last-resort recovery with community guidance.
Defensive patterns

Strategy: validation

Validate before calling

MultiStepOperation<?> op = meta.inProgressSequences.get(nodeId);
if (op != null && !supportedCancelSequences.contains(op.kind()))
    throw new IllegalStateException("Cancel or complete sequence " + op.kind() + " before assassinating " + nodeId);

Try / catch

try { tool.assassinate(nodeId); } catch (IllegalArgumentException e) { if (e.getMessage().contains("Cannot assassinate")) { cancelSequenceFirst(nodeId); } else throw e; }

Prevention

When it happens

Trigger: Assassinate operation in `execute` when metadata.inProgressSequences contains a kind not in supportedCancelSequences and not JOIN/REPLACE (e.g. MOVE, REBUILD, or another MultiStepOperation.Kind).

Common situations: Operator force-removes a node that had an in-progress MOVE or other range-movement sequence; leftover sequence state in the offline metadata snapshot from an interrupted operation.

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

Appendix: source

Thrown at src/java/org/apache/cassandra/tools/CMSOfflineTool.java:370

            NodeId nodeId = nodeIdentifierOption.getNodeId(metadata);

            // Check if there are any in-progress sequences for given node
            // If any, then cancel the sequence and then assassinate it
            if (metadata.inProgressSequences.contains(nodeId))
            {
                MultiStepOperation<?> multiStepOperation = metadata.inProgressSequences.get(nodeId);
                MultiStepOperation.Kind sequenceKind = multiStepOperation.kind();
                if (!supportedCancelSequences.contains(sequenceKind))
                {
                    if (sequenceKind == MultiStepOperation.Kind.JOIN || sequenceKind == MultiStepOperation.Kind.REPLACE)
                    {
                        throw new IllegalArgumentException("Cannot assassinate the node when sequence of kind " +
                                                           sequenceKind + " is in progress. " +
                                                           "Run abortbootstrap instead.");
                    }
                    else
                    {
                        throw new IllegalArgumentException("Cannot assassinate the node when sequence of kind " +
                                                           sequenceKind + " is in progress.");
                    }
                }

                output.out.printf("Cancelling in-progress sequence of kind %s before assassinating node.\n",
                                  metadata.inProgressSequences.get(nodeId).kind());
                metadata = new CancelInProgressSequence(nodeId).execute(metadata).success().metadata;
            }

            metadata = maybeReconfigureCMS(metadata, nodeId);
            Assassinate transformation = new Assassinate(nodeId, ClusterMetadataService.instance().placementProvider());
            ClusterMetadata updatedMetadata = transformation.execute(metadata).success().metadata;

            writeMetadata(output, updatedMetadata, outputFilePath);
        }

        ClusterMetadata maybeReconfigureCMS(ClusterMetadata metadata, NodeId nodeId)
        {

View on GitHub (pinned to 88fd0f6a0e)