apache/cassandra · warning · SkipRepairException

Nothing to repair for

Error message

Nothing to repair for %s in %s - unreplicated keyspace is ignored since repair was called with --ignore-unreplicated-keyspaces

What it means

During repair setup, if the set of neighbors (ranges replicated to this node) is empty and the caller passed --ignore-unreplicated-keyspaces, the coordinator throws SkipRepairException: an unreplicated (single-replica) keyspace has nothing to repair and was explicitly requested to be ignored.

Solutions

  1. Treat SkipRepairException as an expected no-op when using --ignore-unreplicated-keyspaces.
  2. Increase the keyspace's replication factor if the data actually needs multi-node repair.
  3. Run the repair on a node that holds replicas for the keyspace, or restrict the repair to replicated keyspaces.

Example fix

// before
nodetool repair my_rf1_ks --ignore-unreplicated-keyspaces
// after
// skip RF=1 keyspaces, or raise RF:
ALTER KEYSPACE my_rf1_ks WITH replication = {'class':'NetworkTopologyStrategy','dc1':3};
Defensive patterns

Strategy: try-catch

Validate before calling

boolean hasLocalReplica = StorageService.instance.getLocalRanges(ks).iterator().hasNext();

Try / catch

try { repairAsync(ks, optsWithIgnoreUnreplicated); } catch (SkipRepairException e) { logger.info("Nothing to repair: {}", e.getMessage()); }

Prevention

When it happens

Trigger: Running repair with --ignore-unreplicated-keyspaces on a keyspace whose data is not replicated to this node (includeNeighbors empty), e.g. a keyspace with replication factor 1 or no local replicas.

Common situations: Repairing all keyspaces cluster-wide while some use SimpleStrategy RF=1; running repair on a node that holds no replicas for the target keyspace.

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/7ad3a5171e523865. Report an issue: GitHub.

Appendix: source

Thrown at src/java/org/apache/cassandra/repair/RepairCoordinator.java:439

                else if (isMeta && !isCMS)
                {
                    logger.info("{} Repair requested for keyspace {}, which is only replicated by CMS members - ignoring", state.id, state.keyspace);
                    continue;
                }
                else
                {
                    throw RepairException.warn(String.format("Nothing to repair for %s in %s - aborting", range, state.keyspace));
                }
            }
            addRangeToNeighbors(commonRanges, range, includeForRange);
            includeNeighbors.addAll(includeForRange.endpoints());
        }

        if (includeNeighbors.isEmpty())
        {
            if (state.options.ignoreUnreplicatedKeyspaces())
            {
                throw new SkipRepairException(String.format("Nothing to repair for %s in %s - unreplicated keyspace is ignored since repair was called with --ignore-unreplicated-keyspaces",
                                                            state.options.getRanges(),
                                                            state.keyspace));
            }
            else if (isMeta && !isCMS)
            {
                throw new SkipRepairException(String.format("Nothing to repair for %s in %s - keypaces with MetaStrategy replication are not replicated to this node",
                                                            state.options.getRanges(),
                                                            state.keyspace));
            }
        }

        boolean shouldExcludeDeadParticipants = state.options.isForcedRepair();

        if (shouldExcludeDeadParticipants)
        {
            Set<InetAddressAndPort> actualNeighbors = Sets.newHashSet(Iterables.filter(includeNeighbors, ctx.failureDetector()::isAlive));
            shouldExcludeDeadParticipants = !includeNeighbors.equals(actualNeighbors);
            if (shouldExcludeDeadParticipants) includeNeighbors = actualNeighbors;

View on GitHub (pinned to 88fd0f6a0e)