apache/cassandra · error · IllegalStateException
Found no sources for
Error message
Found no sources for
What it means
At the end of movementMap, if a destination is a full (owning) replica but no streaming source could be determined for it, the code throws IllegalStateException. Without a source the destination cannot receive the data it will own, so the move cannot proceed safely. This usually reflects too few live replicas or inconsistent range ownership.
Solutions
- Restore availability: restart down nodes so a full replica of each moved range is live
- Run nodetool repair to bring replicas up to a complete state before moving
- Verify replication settings (RF per DC) give at least one other live full replica for affected ranges
- If data is lost/under-replicated, consider rebuilding the node instead of moving it
Example fix
// before // nodetool move with only one live node holding the range // after // bring second replica up + nodetool repair, verify (nodetool describecluster / status), then nodetool move
Defensive patterns
Strategy: validation
Validate before calling
boolean fullSourceExists = ranges.stream().allMatch(r -> liveReplicasHolding(r).size() >= 1);
if (!fullSourceExists) throw new IllegalStateException("Refusing move: some ranges have no live full replica"); Try / catch
try { move.execute(); } catch (IllegalStateException e) { logger.error("No source for destination: {}", e.getMessage()); rebuildOrRepairBeforeMove(); } Prevention
- Never run moves while multiple nodes are down
- Repair before topology changes so a full replica exists per range
- Avoid moving the only replica of any range (RF=1 clusters should rebuild, not move)
When it happens
Trigger: movementMap completes source selection but sources.fullSource remains null while destination.isFull() is true: no live replica holds the full range to stream from during nodetool move.
Common situations: Multiple nodes down in the cluster so no full replica of the range is available; RF=1 with the single replica involved in the move; repairs never run so no replica has the complete range.
Understand the failure class
Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.
Related errors
- Couldn't find any matching sufficient replica out of: ->
- Another sequence of kind
- Attempting to load denylist and not enough nodes are…
- Can not alter a keyspace to use MetaReplicationStrategy
- Can not create a keyspace with MetaReplicationStrategy
AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10).
Data as JSON: /api/errors/e74b9af4ad09b630.
Report an issue: GitHub.
Appendix: source
Thrown at src/java/org/apache/cassandra/tcm/sequences/Move.java:500
});
// if we are not running with strict consistency, try to find other sources for streaming
if (needsRelaxedSources.get())
{
for (Replica source : DatabaseDescriptor.getNodeProximity()
.sortedByProximity(FBUtilities.getBroadcastAddressAndPort(),
oldOwners.forRange(destination.range()).get()))
{
if (fd.isAlive(source.endpoint()) && !source.endpoint().equals(destination.endpoint()))
{
if ((sources.fullSource == null && source.isFull()) ||
(sources.transientSource == null && source.isTransient()))
sources.addSource(source);
}
}
}
if (sources.fullSource == null && destination.isFull())
throw new IllegalStateException("Found no sources for "+destination);
sources.addToMovements(destination, movements);
});
allMovements.put(params, movements.build());
});
return allMovements.build();
}
private static class SourceHolder
{
private final IFailureDetector fd;
private final boolean strict;
private Replica fullSource;
private Replica transientSource;
private final Replica destination;
private final RangesByEndpoint writeAdditions;
public SourceHolder(IFailureDetector fd, Replica destination, RangesByEndpoint writeAdditions, boolean strict)View on GitHub (pinned to 88fd0f6a0e)