{"record":{"id":"961a7361efcb0f8a","repo":"apache/kafka","slug":"expected-minversionlevel-0-maxversionlevel","errorCode":null,"errorMessage":"Expected minVersionLevel >= 0, maxVersionLevel >= 0 and maxVersionLevel >= minVersionLevel, but received minVersionLevel: %d, maxVersionLevel: %d","messagePattern":"Expected minVersionLevel >= 0, maxVersionLevel >= 0 and maxVersionLevel >= minVersionLevel, but received minVersionLevel: (.+?), maxVersionLevel: (.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"clients/src/main/java/org/apache/kafka/clients/admin/FinalizedVersionRange.java","lineNumber":44,"sourceCode":" */\n@InterfaceAudience.Public\npublic class FinalizedVersionRange {\n    private final short minVersionLevel;\n\n    private final short maxVersionLevel;\n\n    /**\n     * Raises an exception unless the following condition is met:\n     * {@code minVersionLevel >= 1} and {@code maxVersionLevel >= 1} and {@code maxVersionLevel >= minVersionLevel}.\n     *\n     * @param minVersionLevel   The minimum version level value.\n     * @param maxVersionLevel   The maximum version level value.\n     *\n     * @throws IllegalArgumentException   Raised when the condition described above is not met.\n     */\n    public FinalizedVersionRange(final short minVersionLevel, final short maxVersionLevel) {\n        if (minVersionLevel < 0 || maxVersionLevel < 0 || maxVersionLevel < minVersionLevel) {\n            throw new IllegalArgumentException(\n                String.format(\n                    \"Expected minVersionLevel >= 0, maxVersionLevel >= 0 and\" +\n                    \" maxVersionLevel >= minVersionLevel, but received\" +\n                    \" minVersionLevel: %d, maxVersionLevel: %d\", minVersionLevel, maxVersionLevel));\n        }\n        this.minVersionLevel = minVersionLevel;\n        this.maxVersionLevel = maxVersionLevel;\n    }\n\n    public short minVersionLevel() {\n        return minVersionLevel;\n    }\n\n    public short maxVersionLevel() {\n        return maxVersionLevel;\n    }\n\n    @Override","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/apache/kafka/blob/996fb4585aa1bcc8980b0e1b8d6b168b986cd979/clients/src/main/java/org/apache/kafka/clients/admin/FinalizedVersionRange.java#L26-L62","documentation":"Thrown by the FinalizedVersionRange constructor when minVersionLevel or maxVersionLevel is negative, or when max is less than min. These invariants define a legal finalized feature version range. Note the Javadoc claims the floor is 1 but the code actually enforces >= 0, so zero is currently accepted.","triggerScenarios":"Constructing new FinalizedVersionRange(min, max) with a negative argument, or with max < min (e.g. new FinalizedVersionRange((short) 5, (short) 3)). Building a range from deserialized protocol data where the broker sent inconsistent values.","commonSituations":"Wrong argument order (passing max first); off-by-one in version arithmetic; deserialization of corrupt protocol payloads from a buggy or malicious broker.","solutions":["Ensure 0 <= min <= max before constructing; pass min first, then max.","If the values come from the wire, treat the exception as protocol corruption and surface it rather than retrying the same payload.","Add a unit test asserting min <= max for every range your code builds."],"exampleFix":"// before\nnew FinalizedVersionRange(maxLevel, minLevel); // swapped\n\n// after\nnew FinalizedVersionRange(minLevel, maxLevel);","handlingStrategy":"validation","validationCode":"if (min < 0 || max < 0 || max < min) {\n    throw new IllegalArgumentException(\"Illegal range min=\" + min + \" max=\" + max);\n}\nnew FinalizedVersionRange(min, max);","typeGuard":"static boolean isLegalVersionRange(short min, short max) {\n    return min >= 0 && max >= 0 && max >= min;\n}","tryCatchPattern":null,"preventionTips":["Always pass min first, then max.","Assert min <= max in unit tests for every range your code builds."],"tags":["kafka-admin","feature-versioning","argument-validation","client-side"],"backgroundTag":null,"analyzedSha":"996fb4585aa1bcc8980b0e1b8d6b168b986cd979","analyzedAt":"2026-08-11T22:03:28.655Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}