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

  1. Complete or cancel the other in-progress sequence first (e.g. finish the decommission offline).
  2. Verify the intended node: the sequence may belong to a different host than you meant.
  3. 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

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


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)