{"record":{"id":"efc921640f76b3db","repo":"apache/cassandra","slug":"invalid-version-entries-for-guardrailname-guardr","errorCode":null,"errorMessage":"Invalid version entries for <guardrailName> guardrail, they do not follow semver: <invalidEntries>","messagePattern":"Invalid version entries for <guardrailName> guardrail, they do not follow semver: <invalidEntries>","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/config/GuardrailsOptions.java","lineNumber":1726,"sourceCode":"    }\n\n    @VisibleForTesting\n    public static void validateAndSanitizeClientDriverVersions(Map<String, String> map, String guardrailName)\n    {\n        if (map == null || map.isEmpty())\n            return;\n\n        List<String> invalidEntries = new ArrayList<>();\n\n        for (Map.Entry<String, String> entry : map.entrySet())\n        {\n            String sanitized = sanitizeVersion(entry.getValue());\n            if (!isValidVersion(sanitized))\n                invalidEntries.add(entry.getKey());\n        }\n\n        if (!invalidEntries.isEmpty())\n            throw new IllegalArgumentException(\"Invalid version entries for \" + guardrailName + \" guardrail, they do not follow semver: \" + invalidEntries);\n\n        map.replaceAll((driver, version) -> sanitizeVersion(version));\n    }\n\n    public static boolean isValidVersion(String version)\n    {\n        if (version == null)\n            return false;\n\n        // try to construct it\n        try\n        {\n            new Semver(version);\n        }\n        catch (Throwable t)\n        {\n            return false;\n        }","sourceCodeStart":1708,"sourceCodeEnd":1744,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/config/GuardrailsOptions.java#L1708-L1744","documentation":"Driver-name-to-version maps configured for guardrails (e.g. driver version guardrails) must follow semver. validateVersionMap sanitizes each entry and collects keys whose version fails isValidVersion; if any remain, IllegalArgumentException is thrown listing the offending keys.","triggerScenarios":"Configuring a driver version guardrail map (driver_name -> version string) in cassandra.yaml with non-semver versions like '3.x', 'latest', 'v1.2', or '1.2.3.4'.","commonSituations":"Typo'd or human-style version strings in YAML; using marketing names like 'latest' instead of concrete semver versions; copying versions from package managers that allow loose formats.","solutions":["Rewrite each version as valid semver (e.g. '3.10.0').","Remove entries with non-semver versions from the map.","Re-validate configuration at startup."],"exampleFix":"// before\ndriver_versions:\n  cassandra-java-driver: 3.x\n// after\ndriver_versions:\n  cassandra-java-driver: 3.10.0","handlingStrategy":"validation","validationCode":"for (Map.Entry<String,String> e : versions.entrySet())\n    if (!GuardrailsOptions.isValidVersion(e.getValue()))\n        throw new IllegalArgumentException(\"Version for \" + e.getKey() + \" is not semver: \" + e.getValue());","typeGuard":null,"tryCatchPattern":"try { options.validate(); } catch (IllegalArgumentException e) { LOG.error(\"driver version guardrail invalid: {}\", e.getMessage()); }","preventionTips":["Run versions through GuardrailsOptions.isValidVersion() at config write time","Always pin concrete semver versions, never 'latest' or ranges","Lint YAML config for version fields in CI"],"tags":["config","guardrails","semver"],"backgroundTag":"invalid-argument-format","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"}