{"id":"71c1f1db3ef21c35","repo":"apache/kafka","slug":"lz4-doesn-t-support-given-compression-level-level","errorCode":null,"errorMessage":"lz4 doesn't support given compression level: level","messagePattern":"lz4 doesn't support given compression level: level","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"clients/src/main/java/org/apache/kafka/common/compress/Lz4Compression.java","lineNumber":92,"sourceCode":"    @Override\n    public boolean equals(Object o) {\n        if (this == o) return true;\n        if (o == null || getClass() != o.getClass()) return false;\n        Lz4Compression that = (Lz4Compression) o;\n        return level == that.level;\n    }\n\n    @Override\n    public int hashCode() {\n        return Objects.hash(level);\n    }\n\n    public static class Builder implements Compression.Builder<Lz4Compression> {\n        private int level = LZ4.defaultLevel();\n\n        public Builder level(int level) {\n            if (level < LZ4.minLevel() || LZ4.maxLevel() < level) {\n                throw new IllegalArgumentException(\"lz4 doesn't support given compression level: \" + level);\n            }\n\n            this.level = level;\n            return this;\n        }\n\n        @Override\n        public Lz4Compression build() {\n            return new Lz4Compression(level);\n        }\n    }\n}\n","sourceCodeStart":74,"sourceCodeEnd":105,"githubUrl":"https://github.com/apache/kafka/blob/c31c9215e131f8c17e79f8901b48c13ee6aa8e7a/clients/src/main/java/org/apache/kafka/common/compress/Lz4Compression.java#L74-L105","documentation":"IllegalArgumentException thrown by Lz4Compression.Builder.level(int) when the requested LZ4 compression level falls outside the supported range. Kafka pins LZ4 levels to net.jpountz.lz4 constants: minLevel=1, maxLevel=17, defaultLevel=9. The check is `level < 1 || 17 < level`. It is a fail-fast guard at builder time, surfaced before any record is compressed, so it almost always indicates a bad configuration value rather than a runtime data problem.","triggerScenarios":"Calling Compression.of().lz4().level(n) or Compression.lz4().withLevel(n) (and indirectly setting producer config compression.lz4.level / the legacy \"lz4.level\" / a Compression instance with an out-of-range level) where n is <=0, >=18, or any value Kafka's Lz4Compression.Builder rejects in [1,17]. Also reached via reflection/custom wrappers that invoke Builder.level directly.","commonSituations":"See trigger scenarios.","solutions":["Set the LZ4 level to a value in [1,17]; the default is 9, and most workloads use 9 (fast) or 17 (HC, slower).","If you do not need a specific level, omit the level() call entirely so the builder uses LZ4.defaultLevel() (9).","If passing negative levels or levels > 17, switch the codec to zstd (which accepts -131072..22) instead of lz4.","Re-check the property name for your client version (e.g. compression.lz4.level) and ensure no stray 'level' value is inherited from a zstd/snappy config block."],"exampleFix":"// before\nCompression compression = Compression.of().lz4().level(0).build(); // throws: 0 < 1\n\n// after\nCompression compression = Compression.of().lz4().level(9).build(); // valid; or omit .level() to use default 9","handlingStrategy":"validation","validationCode":"// Validate the level against Kafka's own bounds BEFORE calling the builder.\nimport org.apache.kafka.common.record.internal.CompressionType;\nint sanitizeLz4Level(int requested) {\n    int lo = CompressionType.LZ4.minLevel();\n    int hi = CompressionType.LZ4.maxLevel();\n    if (requested < lo || requested > hi) {\n        return CompressionType.LZ4.defaultLevel(); // or throw your own IllegalArgumentException\n    }\n    return requested;\n}\nCompression lz4 = new Lz4Compression.Builder().level(sanitizeLz4Level(userLevel)).build();","typeGuard":null,"tryCatchPattern":"try {\n    new Lz4Compression.Builder().level(userLevel).build();\n} catch (IllegalArgumentException e) {\n    // message starts with \"lz4 doesn't support given compression level\"\n    log.warn(\"Invalid LZ4 level {}, falling back to default\", userLevel);\n    compression = Compression.lz4(); // default-level factory\n}","preventionTips":["Do not hard-code LZ4 levels copied from other libraries (zstd/gzip ranges differ).","Read bounds dynamically via LZ4.minLevel()/maxLevel() rather than literals — they can change across kafka-clients versions.","When exposing level to end users via your own config, validate it at config-load time, not at produce time."],"tags":["compression","lz4","configuration","kafka-client","producer"],"analyzedSha":"c31c9215e131f8c17e79f8901b48c13ee6aa8e7a","analyzedAt":"2026-08-03T12:34:05.770Z","schemaVersion":2}