apache/cassandra · error · IllegalStateException

No holder claimed isPendingRepair: %s, isPendingRepair %s

Error message

No holder claimed isPendingRepair: %s, isPendingRepair %s

What it means

getHolder(long repairedAt, TimeUUID pendingRepair, boolean isTransient) resolves which AbstractStrategyHolder owns an SSTable based on its repair-state flags. When no holder's managesRepairedGroup matches the given combination, an IllegalStateException is thrown. Note the message has a typo (says isPendingRepair twice; first %s is actually isRepaired). This signals that the repaired/unrepaired/pending-repair holder partitioning does not cover the state combination, which should be impossible in a consistent state.

Source

Thrown at src/java/org/apache/cassandra/db/compaction/CompactionStrategyManager.java:966

    }

    private AbstractStrategyHolder getHolder(long repairedAt, TimeUUID pendingRepair, boolean isTransient)
    {
        return getHolder(repairedAt != ActiveRepairService.UNREPAIRED_SSTABLE,
                         pendingRepair != ActiveRepairService.NO_PENDING_REPAIR,
                         isTransient);
    }

    @VisibleForTesting
    AbstractStrategyHolder getHolder(boolean isRepaired, boolean isPendingRepair, boolean isTransient)
    {
        for (AbstractStrategyHolder holder : holders)
        {
            if (holder.managesRepairedGroup(isRepaired, isPendingRepair, isTransient))
                return holder;
        }

        throw new IllegalStateException(String.format("No holder claimed isPendingRepair: %s, isPendingRepair %s",
                                                      isRepaired, isPendingRepair));
    }

    @VisibleForTesting
    ImmutableList<AbstractStrategyHolder> getHolders()
    {
        return holders;
    }

    /**
     * Split sstables into a list of grouped sstable containers, the list index an sstable
     *
     * lives in matches the list index of the holder that's responsible for it
     */
    public final List<GroupedSSTableContainer> groupSSTables(Iterable<SSTableReader> sstables)
    {
        List<GroupedSSTableContainer> classified = new ArrayList<>(holders.size());
        for (AbstractStrategyHolder holder : holders)

View on GitHub (pinned to 88fd0f6a0e)

Solutions

  1. Restart the node to reinitialize holder sets
  2. Complete or abort in-flight repair sessions (nodetool repair_admin cancel / fail) and re-run repair
  3. Remove orphaned pending-repair sstables (they can be identified via sstablemetadata) so states realign
  4. If reproducible, file a Cassandra bug - the combination should be covered by one of the four holders
Defensive patterns

Strategy: validation

Validate before calling

boolean ok = csm.getHolders().stream()
    .anyMatch(h -> h.managesRepairedGroup(isRepaired, isPendingRepair, isTransient));
if (!ok) throw new IllegalStateException("unsupported repair-state combination");

Try / catch

try { runRepairTransition(); }
catch (IllegalStateException e) {
  repairAdmin.abortStaleSessions();
  rerunRepair();
}

Prevention

When it happens

Trigger: Operations that classify sstables by repair state (repairedAt != UNREPAIRED_SSTABLE, pendingRepair != NO_PENDING_REPAIR, isTransient) when the combination does not match repaired, unrepaired, pending-repair, or transient holders - e.g. corrupted/unsupported flag combinations produced during repair transitions.

Common situations: Incremental repair interrupted mid-transition leaving sstables in an unexpected repair-state combination; version-mismatched sstables after upgrade; bugs in pending repair session handling.

Understand the failure class

Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.

Related errors


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