{"record":{"id":"49b6f3a6bffb0cb0","repo":"apache/cassandra","slug":"no-holder-claimed-ispendingrepair-s-ispendingre","errorCode":null,"errorMessage":"No holder claimed isPendingRepair: %s, isPendingRepair %s","messagePattern":"No holder claimed isPendingRepair: (.+?), isPendingRepair (.+?)","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/db/compaction/CompactionStrategyManager.java","lineNumber":966,"sourceCode":"    }\n\n    private AbstractStrategyHolder getHolder(long repairedAt, TimeUUID pendingRepair, boolean isTransient)\n    {\n        return getHolder(repairedAt != ActiveRepairService.UNREPAIRED_SSTABLE,\n                         pendingRepair != ActiveRepairService.NO_PENDING_REPAIR,\n                         isTransient);\n    }\n\n    @VisibleForTesting\n    AbstractStrategyHolder getHolder(boolean isRepaired, boolean isPendingRepair, boolean isTransient)\n    {\n        for (AbstractStrategyHolder holder : holders)\n        {\n            if (holder.managesRepairedGroup(isRepaired, isPendingRepair, isTransient))\n                return holder;\n        }\n\n        throw new IllegalStateException(String.format(\"No holder claimed isPendingRepair: %s, isPendingRepair %s\",\n                                                      isRepaired, isPendingRepair));\n    }\n\n    @VisibleForTesting\n    ImmutableList<AbstractStrategyHolder> getHolders()\n    {\n        return holders;\n    }\n\n    /**\n     * Split sstables into a list of grouped sstable containers, the list index an sstable\n     *\n     * lives in matches the list index of the holder that's responsible for it\n     */\n    public final List<GroupedSSTableContainer> groupSSTables(Iterable<SSTableReader> sstables)\n    {\n        List<GroupedSSTableContainer> classified = new ArrayList<>(holders.size());\n        for (AbstractStrategyHolder holder : holders)","sourceCodeStart":948,"sourceCodeEnd":984,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/db/compaction/CompactionStrategyManager.java#L948-L984","documentation":"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.","triggerScenarios":"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.","commonSituations":"Incremental repair interrupted mid-transition leaving sstables in an unexpected repair-state combination; version-mismatched sstables after upgrade; bugs in pending repair session handling.","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"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"boolean ok = csm.getHolders().stream()\n    .anyMatch(h -> h.managesRepairedGroup(isRepaired, isPendingRepair, isTransient));\nif (!ok) throw new IllegalStateException(\"unsupported repair-state combination\");","typeGuard":null,"tryCatchPattern":"try { runRepairTransition(); }\ncatch (IllegalStateException e) {\n  repairAdmin.abortStaleSessions();\n  rerunRepair();\n}","preventionTips":["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"],"tags":["compaction","repair","invariant","internal-error"],"backgroundTag":"internal-invariant-violation","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}