apache/cassandra · info · SkipRepairException

Nothing to repair for

Error message

Nothing to repair for %s in %s - keypaces with MetaStrategy replication are not replicated to this node

What it means

RepairCoordinator throws a SkipRepairException when a repair is requested for a keyspace whose replicas do not include this node because the keyspace uses MetaStrategy replication (e.g. Accord/CMS metadata keyspace) and this node is not the CMS. SkipRepairException aborts this node's participation in the repair quietly rather than failing the whole session.

Solutions

  1. Verify the keyspace genuinely uses MetaStrategy and exclude it from repair ranges
  2. Run the repair from CMS nodes if MetaStrategy repair is intended
  3. Use --ignore-unreplicated-keyspaces (-r) so unreplicated keyspaces are skipped silently
  4. Confirm placement with `nodetool describecluster` / schema replication settings

Example fix

// before
nodetool repair <meta_keyspace>
// after
nodetool repair -r <user_keyspace>  // skip unreplicated/meta keyspaces
Defensive patterns

Strategy: validation

Validate before calling

KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(keyspace);
if (ksm != null && ksm.params.replication.klass.getSimpleName().equals("MetaStrategy") && !StorageService.instance.isCMS())
    return; // skip repair for MetaStrategy keyspace this node doesn't replicate

Prevention

When it happens

Trigger: Running `nodetool repair` (or StorageService.repairAsync) on a MetaStrategy-replicated keyspace from a node that is not the CMS; getNeighborsAndRanges hits the isMeta && !isCMS branch.

Common situations: Operators repairing all keyspaces (e.g. `nodetool repair -r`) on clusters using Accord/CMS metadata tables; nodes in a datacenter not hosting MetaStrategy ranges.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10). Data as JSON: /api/errors/fed9b38453b772e9. Report an issue: GitHub.

Appendix: source

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

                {
                    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;
            else logger.info("{} all replicas {} considered up and healthy; clearing force flag for this job", state.id, includeNeighbors);
        }
        return new NeighborsAndRanges(shouldExcludeDeadParticipants, includeNeighbors.containsAll(allNeighbors), includeNeighbors, commonRanges);
    }

    private void maybeStoreParentRepairStart(String[] cfnames)

View on GitHub (pinned to 88fd0f6a0e)