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
- Restart the node to reinitialize holder sets
- Complete or abort in-flight repair sessions (nodetool repair_admin cancel / fail) and re-run repair
- Remove orphaned pending-repair sstables (they can be identified via sstablemetadata) so states realign
- 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
- Do not run overlapping incremental repairs on one table
- Cancel/abort abandoned repair sessions before new ones
- Ensure sstables come from a single Cassandra version (no mixed-version metadata)
- Re-run repair after any IllegalStateException involving repair metadata
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
- No holder claimed
- %s SSTable %s (%s) does not intersect repaired ranges %s, th
- You can't mix repaired and unrepaired data in a compaction
- You can't compact sstables from different pending repair ses
- Failed setting pending repair to %s on %s (pending repair is
AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10).
Data as JSON: /api/errors/49b6f3a6bffb0cb0.
Report an issue: GitHub.