{"record":{"id":"97d1b3f73217601e","repo":"apache/cassandra","slug":"cannot-repair-paxos-in-a-preview-repair","errorCode":null,"errorMessage":"cannot repair paxos in a preview repair","messagePattern":"cannot repair paxos in a preview repair","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/service/ActiveRepairService.java","lineNumber":476,"sourceCode":"                                             boolean excludedDeadNodes,\n                                             String keyspace,\n                                             RepairParallelism parallelismDegree,\n                                             boolean allReplicas,\n                                             boolean isIncremental,\n                                             boolean pullRepair,\n                                             PreviewKind previewKind,\n                                             boolean optimiseStreams,\n                                             boolean repairData,\n                                             boolean repairPaxos,\n                                             boolean dontPurgeTombstones,\n                                             boolean repairAccord,\n                                             boolean permitNoQuorum,\n                                             ExecutorPlus executor,\n                                             Scheduler validationScheduler,\n                                             String... cfnames)\n    {\n        if (repairPaxos && previewKind != PreviewKind.NONE)\n            throw new IllegalArgumentException(\"cannot repair paxos in a preview repair\");\n\n        if (range.endpoints.isEmpty())\n            return null;\n\n        if (cfnames.length == 0)\n            return null;\n\n        final RepairSession session = new RepairSession(ctx, validationScheduler, parentRepairSession,\n                                                        range, excludedDeadNodes, keyspace,\n                                                        parallelismDegree, allReplicas, isIncremental, pullRepair,\n                                                        previewKind, optimiseStreams, repairData, repairPaxos,\n                                                        dontPurgeTombstones, repairAccord, permitNoQuorum, cfnames);\n        repairs.getIfPresent(parentRepairSession).register(session.state);\n\n        sessions.put(session.getId(), session);\n        // register listeners\n        registerOnFdAndGossip(session);\n","sourceCodeStart":458,"sourceCodeEnd":494,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/service/ActiveRepairService.java#L458-L494","documentation":"ActiveRepairService.submitRepairSession refuses to create a repair session that combines Paxos repair with a preview repair. Preview repairs (irange/repairedAt previews) only estimate what a repair would do and never commit Merkle trees, so running a Paxos consistency repair in preview mode is meaningless and rejected up front with IllegalArgumentException.","triggerScenarios":"Calling RepairSession/submitRepairSession with repairPaxos=true while previewKind != PreviewKind.NONE, e.g. running nodetool repair with --repair-paxos together with --preview, or invoking the JMX/API repair path with both options set.","commonSituations":"Operators scripting nodetool repair combining flags like -pr/--repair-paxos with preview or incremental-repair-adjacent options; automated repair schedulers that set preview kind globally without clearing paxos repair.","solutions":["Remove the preview option (use PreviewKind.NONE) so the Paxos repair can actually run","Remove the --repair-paxos flag when performing a preview repair","If the goal is Paxos consistency, run a full (non-preview) repair: nodetool repair --paxos-only or a normal repair without preview flags"],"exampleFix":"// before\nstorageService.repair(keyspace, options-with-preview-and-paxos); // throws\n// after\nMap<String,String> opts = new HashMap<>();\nopts.put(RepairOption.PARALLELISM_KEY, \"parallel\");\nopts.put(RepairOption.PAXOS_ONLY_KEY, \"true\"); // no preview\nstorageService.repair(keyspace, opts);","handlingStrategy":"validation","validationCode":"if (opts.paxosOnly || opts.repairPaxos) {\n    if (opts.preview || opts.previewKind !== 'NONE')\n        throw new Error('preview and paxos repair are mutually exclusive');\n}","typeGuard":null,"tryCatchPattern":"try { repairSession(..., /*repairPaxos*/ true, /*previewKind*/ PreviewKind.NONE, ...); }\ncatch (IllegalArgumentException e) { log.error(\"preview+paxos conflict\", e); }","preventionTips":["Never combine preview flags with --repair-paxos / paxos-only in repair scripts","Validate RepairOption maps before handing them to StorageService.repair"],"tags":["repair","paxos","illegal-argument"],"backgroundTag":"invalid-argument-value","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}