{"record":{"id":"1e4b01d4d1cf82b3","repo":"apache/cassandra","slug":"progress-barrier-only-supports-all-each-quorum-l","errorCode":null,"errorMessage":"Progress barrier only supports ALL, EACH_QUORUM, LOCAL_QUORUM, QUORUM, ONE and NODE_LOCAL, but not ","messagePattern":"Progress barrier only supports ALL, EACH_QUORUM, LOCAL_QUORUM, QUORUM, ONE and NODE_LOCAL, but not ","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/tcm/sequences/ProgressBarrier.java","lineNumber":208,"sourceCode":"                        waitFor = new WaitForAll(writes, reads);\n                        break;\n                    case EACH_QUORUM:\n                        waitFor = new WaitForEachQuorum(writes, reads, metadata.directory);\n                        break;\n                    case LOCAL_QUORUM:\n                        waitFor = new WaitForLocalQuorum(writes, reads, metadata.directory, location);\n                        break;\n                    case QUORUM:\n                        waitFor = new WaitForQuorum(writes, reads);\n                        break;\n                    case ONE:\n                        waitFor = new WaitForOne(writes, reads);\n                        break;\n                    case NODE_LOCAL:\n                        waitFor = new WaitForNone();\n                        break;\n                    default:\n                        throw new IllegalArgumentException(\"Progress barrier only supports ALL, EACH_QUORUM, LOCAL_QUORUM, QUORUM, ONE and NODE_LOCAL, but not \" + cl);\n                }\n\n                maxWaitFor = Math.max(waitFor.waitFor(), maxWaitFor);\n                waiters.add(waitFor);\n            }\n        }\n\n        Set<InetAddressAndPort> collected = new HashSet<>();\n        Set<WatermarkRequest> requests = new HashSet<>();\n        for (InetAddressAndPort peer : superset)\n            requests.add(new WatermarkRequest(peer, messagingService, waitFor));\n\n        long start = Clock.Global.nanoTime();\n        Retry deadline = Retry.untilElapsed(TimeUnit.MILLISECONDS.toNanos(TIMEOUT_MILLIS), TCMMetrics.instance.progressBarrierRetries, WAIT_STRATEGY);\n        while (!deadline.hasExpired())\n        {\n            for (WatermarkRequest request : requests)\n                request.retry();","sourceCodeStart":190,"sourceCodeEnd":226,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/tcm/sequences/ProgressBarrier.java#L190-L226","documentation":"Thrown by ProgressBarrier.await when a consistency level not supported by the progress barrier (anything other than ALL, EACH_QUORUM, LOCAL_QUORUM, QUORUM, ONE, NODE_LOCAL) is passed. The barrier maps each supported CL to a waiter strategy (WaitForAll/Quorum/One/None); other CLs have no defined waiter.","triggerScenarios":"Calling ProgressBarrier.await with a ConsistencyLevel such as TWO, THREE, LOCAL_ONE, ANY, or SERIAL.","commonSituations":"Reusing application-facing consistency levels in TCM/metadata barrier code that only accepts a subset; refactors that propagate a caller's CL straight into await without mapping; tests passing arbitrary CL enums.","solutions":["Pass one of the supported levels: ALL, EACH_QUORUM, LOCAL_QUORUM, QUORUM, ONE, or NODE_LOCAL","Map unsupported CLs before calling await (e.g. treat TWO/THREE as QUORUM if semantically acceptable)","Add an explicit switch case for the new CL in ProgressBarrier if it genuinely needs support","Validate/whitelist the CL at the API boundary that feeds await"],"exampleFix":"// before\nbarrier.await(ConsistencyLevel.TWO, ...);\n// after\nConsistencyLevel cl = (cl == ConsistencyLevel.TWO || cl == ConsistencyLevel.THREE) ? ConsistencyLevel.QUORUM : cl;\nbarrier.await(cl, ...);","handlingStrategy":"validation","validationCode":"private static final Set<ConsistencyLevel> SUPPORTED = EnumSet.of(ALL, EACH_QUORUM, LOCAL_QUORUM, QUORUM, ONE, NODE_LOCAL);\nif (!SUPPORTED.contains(cl)) throw new IllegalArgumentException(\"unsupported CL for progress barrier: \" + cl);","typeGuard":null,"tryCatchPattern":"try { barrier.await(cl, writes, reads); }\ncatch (IllegalArgumentException e) { if (e.getMessage().startsWith(\"Progress barrier only supports\")) barrier.await(mapToSupported(cl), writes, reads); else throw e; }","preventionTips":["Whitelist CLs at your API boundary before calling await","Map TWO/THREE/SERIAL-style levels to a supported equivalent explicitly","Add a unit test enumerating every CL your code can pass to await"],"tags":["consistency-level","invalid-enum","tcm"],"backgroundTag":"invalid-enum-value","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}