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

  1. Restore availability: restart down nodes so a full replica of each moved range is live
  2. Run nodetool repair to bring replicas up to a complete state before moving
  3. Verify replication settings (RF per DC) give at least one other live full replica for affected ranges
  4. 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

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


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)