apache/cassandra · error · IllegalStateException
Strict consistency requires the node losing the range to be…
Error message
Strict consistency requires the node losing the range to be UP but is DOWN
What it means
Thrown by Move.addSource when strict consistency is requested for a consistent range movement but the node losing the range (the source) is currently DOWN per failure detection. A consistent move requires streaming hand-off from a live source; if it is dead the invariant cannot be maintained, so strict mode aborts while non-strict returns false and skips the source.
Solutions
- Wait for / restore the source node to be UP (fix networking, restart the node) and retry the movement
- Retry the operation with strict consistency disabled so the down source is skipped
- Remove the down node from the cluster first (decommission/assassinate with appropriate procedures) and re-plan the movement
- Check FailureDetector settings (phi threshold) if the node is actually alive but flapping
Example fix
// before MoveMultiRange.move(systemKeyspace, ranges, /* strict */ true); // fails while source is DOWN // after if (failureDetector.isAlive(source)) move(ranges, true); else move(ranges, false); // or wait for node to come up
Defensive patterns
Strategy: validation
Validate before calling
// check all sources are alive before a strict move
if (sources.stream().anyMatch(r -> !FailureDetector.instance.isAlive(r.endpoint())))
throw new IllegalStateException("abort: strict move requires all sources UP"); Try / catch
try { move(ranges, true); }
catch (IllegalStateException e) { if (e.getMessage().contains("is DOWN")) scheduleRetryAfterNodeRecovery(); else throw e; } Prevention
- Check FailureDetector status of all involved nodes before starting strict movements
- Only run topology operations during healthy-cluster windows
- Investigate flapping failure detection (phi thresholds, networking) proactively
When it happens
Trigger: Executing a strict-consistency range movement where a source replica of the range is marked DOWN by FailureDetector at planning time.
Common situations: Running nodetool move/assassinate cleanup workflows while a node is down; firewalled or partially partitioned clusters where failure detector falsely reports a live node down; attempting topology repair during an outage instead of waiting for recovery.
Related errors
- Source for is not remaining as a replica after the move…
- A node required to move the data consistently is down
- Attempting to load denylist and not enough nodes are…
- Can not start range streaming as all candidates
- Cannot achieve consistency level
AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10).
Data as JSON: /api/errors/f81d10b4d1e8b0c6.
Report an issue: GitHub.
Appendix: source
Thrown at src/java/org/apache/cassandra/tcm/sequences/Move.java:559
// replica we need to make sure it remains a replica for the range after the move has finished:
if (writeAdditions.get(source.endpoint()).byRange().get(destination.range()) == null)
{
if (strict)
throw new IllegalStateException(String.format("Source %s for %s is not remaining as a replica after the move, can't do a consistent range movement, retry with that disabled", source, destination));
else
return false;
}
return true;
}
else
{
transientSource = source;
}
}
return true;
}
else if (strict)
throw new IllegalStateException("Strict consistency requires the node losing the range to be UP but " + source + " is DOWN");
return false;
}
private void addToMovements(Replica destination, EndpointsByReplica.Builder movements)
{
if (fullSource != null)
movements.put(destination, fullSource);
if (transientSource != null)
movements.put(destination, transientSource);
}
}
private static int nextToIndex(Transformation.Kind next)
{
switch (next)
{
case START_MOVE:
return 0;View on GitHub (pinned to 88fd0f6a0e)