apache/cassandra · error · IllegalArgumentException
Another sequence of kind
Error message
Another sequence of kind ${kind} is in progress for node ${nodeIpOrId}. Cannot proceed with force join. What it means
Thrown by ForceJoin when the node already has an in-progress MultiStepOperation whose kind is not JOIN. Concurrent sequences (e.g. decommission, replace) cannot be bypassed by a force join, so the tool refuses to proceed.
Solutions
- Complete or cancel the other in-progress sequence first (e.g. finish the decommission offline).
- Verify the intended node: the sequence may belong to a different host than you meant.
- Edit/discard the stale metadata only if you understand the consequences of dropping the sequence.
Example fix
// before // forceJoin on node with inProgressSequences[nodeId] = DecommissionSequence // after // complete/cancel the decommission sequence, then forceJoin
Defensive patterns
Strategy: validation
Validate before calling
MultiStepOperation<?> op = metadata.inProgressSequences.get(nodeId);
if (op != null && op.kind() != MultiStepOperation.Kind.JOIN)
throw new IllegalStateException("Finish/cancel " + op.kind() + " first"); Try / catch
try { forceJoin(...); } catch (IllegalArgumentException e) { logger.error("Conflicting sequence: " + e.getMessage()); } Prevention
- Resolve pending sequences before forcing joins
- Audit inProgressSequences in the metadata snapshot
- Only use force join as a last-resort recovery
When it happens
Trigger: Force-joining a node that has an in-progress sequence of a non-JOIN kind in metadata.inProgressSequences, such as an active decommission or move sequence recorded in the metadata snapshot.
Common situations: A decommission/rebuild was interrupted and left its sequence recorded; operator tries force join as a recovery shortcut without finishing or cancelling the other operation first.
Understand the failure class
Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.
Related errors
- All nodes are not yet upgraded
- Can not add a new in-progress sequence for
- Can not advance in-progress sequence, since its kind is
- Can not apply in-progress sequence, since its kind is
- Can not commit transformation
AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10).
Data as JSON: /api/errors/996646c23b4a6c96.
Report an issue: GitHub.
Appendix: source
Thrown at src/java/org/apache/cassandra/tools/CMSOfflineTool.java:663
NodeId nodeId = nodeIdentifierOption.getNodeId(metadata);
Set<Token> tokenSet = new HashSet<>(tokens.size());
Token.TokenFactory tokenFactory = metadata.partitioner.getTokenFactory();
tokens.forEach(t -> tokenSet.add(tokenFactory.fromString(t)));
NodeState nodeState = metadata.directory.peerState(nodeId);
if (nodeState == NodeState.JOINED)
{
throw new IllegalArgumentException("Node " + nodeIdentifierOption.getNodeIpOrId() +
" is already in JOINED state.");
}
ClusterMetadata updatedMetadata;
if (metadata.inProgressSequences.get(nodeId) != null)
{
MultiStepOperation<?> multiStepOperation = metadata.inProgressSequences.get(nodeId);
if (multiStepOperation.kind() != MultiStepOperation.Kind.JOIN)
{
throw new IllegalArgumentException("Another sequence of kind " + multiStepOperation.kind() +
" is in progress for node " + nodeIdentifierOption.getNodeIpOrId() +
". Cannot proceed with force join.");
}
BootstrapAndJoin bootstrapAndJoin = (BootstrapAndJoin) multiStepOperation;
Set<Token> sequenceTokens = bootstrapAndJoin.finishJoin.tokens;
if (tokens.isEmpty()
|| (tokenSet.size() == sequenceTokens.size() && sequenceTokens.containsAll(tokenSet)))
{
updatedMetadata = bootstrapAndJoin.applyTo(metadata).success().metadata;
}
else
{
// If tokens are provided, then it should match with the in-progress sequence tokens
throw new IllegalArgumentException("The tokens provided " + tokens + " do not match with " +
" in progress BootstrapAndJoin sequence tokens " +
sequenceTokens + ". Cannot proceed further.");
}
}View on GitHub (pinned to 88fd0f6a0e)