{"record":{"id":"906c85a41a8480ba","repo":"apache/cassandra","slug":"s-s-cannot-be-greater-than-s-s-for-s","errorCode":null,"errorMessage":"%s='%s' cannot be greater than %s='%s' for %s","messagePattern":"(.+?)='(.+?)' cannot be greater than (.+?)='(.+?)' for (.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/repair/autorepair/RepairTokenRangeSplitter.java","lineNumber":185,"sourceCode":"    public RepairTokenRangeSplitter(AutoRepairConfig.RepairType repairType, Map<String, String> parameters)\n    {\n        this.repairType = repairType;\n        this.givenParameters.putAll(parameters);\n\n        reinitParameters();\n    }\n\n    private void reinitParameters()\n    {\n        RepairTypeDefaults defaults = DEFAULTS_BY_REPAIR_TYPE.get(repairType);\n\n        DataStorageSpec.LongBytesBound bytesPerAssignmentTmp = getPropertyOrDefault(BYTES_PER_ASSIGNMENT, DataStorageSpec.LongBytesBound::new, defaults.bytesPerAssignment);\n        DataStorageSpec.LongBytesBound maxBytesPerScheduleTmp = getPropertyOrDefault(MAX_BYTES_PER_SCHEDULE, DataStorageSpec.LongBytesBound::new, defaults.maxBytesPerSchedule);\n\n        // Validate that bytesPerAssignment <= maxBytesPerSchedule\n        if (bytesPerAssignmentTmp.toBytes() > maxBytesPerScheduleTmp.toBytes())\n        {\n            throw new IllegalArgumentException(String.format(\"%s='%s' cannot be greater than %s='%s' for %s\",\n                                                             BYTES_PER_ASSIGNMENT,\n                                                             bytesPerAssignmentTmp,\n                                                             MAX_BYTES_PER_SCHEDULE,\n                                                             maxBytesPerScheduleTmp,\n                                                             repairType.getConfigName()));\n        }\n\n        bytesPerAssignment = bytesPerAssignmentTmp;\n        maxBytesPerSchedule = maxBytesPerScheduleTmp;\n\n        partitionsPerAssignment = getPropertyOrDefault(PARTITIONS_PER_ASSIGNMENT, Long::parseLong, defaults.partitionsPerAssignment);\n        maxTablesPerAssignment = getPropertyOrDefault(MAX_TABLES_PER_ASSIGNMENT, Integer::parseInt, defaults.maxTablesPerAssignment);\n\n        logger.info(\"Configured {}[{}] with {}={}, {}={}, {}={}, {}={}\", RepairTokenRangeSplitter.class.getName(),\n                    repairType.getConfigName(),\n                    BYTES_PER_ASSIGNMENT, bytesPerAssignment,\n                    PARTITIONS_PER_ASSIGNMENT, partitionsPerAssignment,\n                    MAX_TABLES_PER_ASSIGNMENT, maxTablesPerAssignment,","sourceCodeStart":167,"sourceCodeEnd":203,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/repair/autorepair/RepairTokenRangeSplitter.java#L167-L203","documentation":"RepairTokenRangeSplitter.reinitParameters validates that bytes_per_assignment <= max_bytes_per_schedule for the given repair type and throws IllegalArgumentException when bytesPerAssignment exceeds maxBytesPerSchedule. This prevents scheduling assignments larger than the per-schedule bytes budget.","triggerScenarios":"Setting auto-repair config where BYTES_PER_ASSIGNMENT is greater than MAX_BYTES_PER_SCHEDULE — triggered at init (constructor calls reinitParameters) or via setParameter dynamic update.","commonSituations":"Config edits in cassandra.yaml with mismatched byte bounds (e.g. 10GB assignment vs 5GB schedule); dynamic updates via nodetool setautorepairconfig; unit mistakes (MB vs GB) in DataStorageSpec values.","solutions":["Lower bytes_per_assignment so it is <= max_bytes_per_schedule","Raise max_bytes_per_schedule to at least bytes_per_assignment","Use consistent units in both values and re-apply the config"],"exampleFix":"# before\nbytes_per_assignment: 10GB\nmax_bytes_per_schedule: 5GB\n# after\nbytes_per_assignment: 1GB\nmax_bytes_per_schedule: 5GB","handlingStrategy":"validation","validationCode":"DataStorageSpec.LongBytesBound assign = parse(bytesPerAssignment);\nDataStorageSpec.LongBytesBound max = parse(maxBytesPerSchedule);\nif (assign.toBytes() > max.toBytes())\n    throw new IllegalArgumentException(\"bytes_per_assignment must be <= max_bytes_per_schedule\");","typeGuard":null,"tryCatchPattern":"try { splitter.setParameter(key, value); }\ncatch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"cannot be greater than\"))\n        logger.warn(\"Auto-repair byte bounds invalid; fix config and retry\", e);\n    else throw e;\n}","preventionTips":["Set both bytes bounds together and assert assign <= max","Double-check units (MiB/MB, GiB/GB) in cassandra.yaml values","Run getautorepairconfig after updates to confirm applied values"],"tags":["autorepair","configuration","validation","bytes"],"backgroundTag":"invalid-config-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"}