apache/cassandra · warning

Not running paxos repair for topology change because there a

Error message

Not running paxos repair for topology change because there are no ranges to repair

What it means

repairPaxosForTopologyChangeAsync checks that there are actual token ranges to repair for the given keyspace before scheduling Paxos repairs. When the ranges collection is empty, it warns and returns an empty list - nothing to repair, which may indicate the keyspace has no data or the caller passed no ranges.

Source

Thrown at src/java/org/apache/cassandra/service/ActiveRepairService.java:1198

        List<Future<?>> futures = new ArrayList<>();

        for (Supplier<Future<?>> futureSupplier : work)
            futures.add(futureSupplier.get());

        return FutureCombiner.allOf(futures);
    }

    public List<Supplier<Future<?>>> repairPaxosForTopologyChangeAsync(String ksName, Collection<Range<Token>> ranges, String reason)
    {
        if (!paxosRepairEnabled())
        {
            logger.warn("Not running paxos repair for topology change because paxos repair has been disabled");
            return Collections.emptyList();
        }

        if (ranges.isEmpty())
        {
            logger.warn("Not running paxos repair for topology change because there are no ranges to repair");
            return Collections.emptyList();
        }
        ClusterMetadata metadata = ClusterMetadata.current();
        List<TableMetadata> tables = Lists.newArrayList(metadata.schema.getKeyspaces().getNullable(ksName).tables);
        List<Supplier<Future<?>>> futures = new ArrayList<>(ranges.size() * tables.size());
        Keyspace keyspace = Keyspace.open(ksName);

        for (Range<Token> range: ranges)
        {
            for (TableMetadata table : tables)
            {

                ReplicationParams replication = keyspace.getMetadata().params.replication;
                // Special case meta keyspace as it uses a custom partitioner/tokens, but the paxos table and repairs
                // are based on the system partitioner
                EndpointsForRange endpoints = replication.isMeta()
                                              ? ClusterMetadata.current().fullCMSMembersAsReplicas()
                                              : ClusterMetadata.current().placement(replication).reads.forRange(range).get();

View on GitHub (pinned to 88fd0f6a0e)

Solutions

  1. Verify the keyspace name and its replication strategy (does it own any ranges here?).
  2. Check the caller that computed the ranges (topology change logic) to confirm the empty set is expected.
  3. If the keyspace should own ranges, inspect cluster metadata (nodetool describering) to see token ownership.
Defensive patterns

Strategy: validation

Validate before calling

// check keyspace owns ranges before requesting paxos repair
List<Range<Token>> ranges = StorageService.instance.getLocalRanges(ksName);
if (ranges == null || ranges.isEmpty())
    logger.info("Keyspace {} owns no local ranges; skipping paxos repair", ksName);

Prevention

When it happens

Trigger: Calling repairPaxosForTopologyChangeAsync(ksName, ranges, reason) with ranges.isEmpty() true - e.g. topology change operation computed no owned ranges for the keyspace, or keyspace has no tables/ranges owned.

Common situations: Decommission/move on a keyspace with no replicas on this node; programmatic callers passing an empty range set; keyspace name typo yielding no ranges.

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