{"record":{"id":"f886e3825b8e38a9","repo":"apache/cassandra","slug":"compression-parameters-too-long-length-d-cannot","errorCode":null,"errorMessage":"Compression parameters too long, length %d cannot be above 65535.","messagePattern":"Compression parameters too long, length (.+?) cannot be above 65535\\.","errorType":"exception","errorClass":"ConfigurationException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/db/commitlog/CommitLogDescriptor.java","lineNumber":112,"sourceCode":"    {\n        writeHeader(out, descriptor, Collections.<String, String>emptyMap());\n    }\n\n    /**\n     * @param additionalHeaders Allow segments to pass custom header data\n     */\n    public static void writeHeader(ByteBuffer out, CommitLogDescriptor descriptor, Map<String, String> additionalHeaders)\n    {\n        CRC32 crc = new CRC32();\n        out.putInt(descriptor.version);\n        updateChecksumInt(crc, descriptor.version);\n        out.putLong(descriptor.id);\n        updateChecksumInt(crc, (int) (descriptor.id & 0xFFFFFFFFL));\n        updateChecksumInt(crc, (int) (descriptor.id >>> 32));\n        String parametersString = constructParametersString(descriptor.compression, descriptor.encryptionContext, additionalHeaders);\n        byte[] parametersBytes = parametersString.getBytes(StandardCharsets.UTF_8);\n        if (parametersBytes.length != (((short) parametersBytes.length) & 0xFFFF))\n            throw new ConfigurationException(String.format(\"Compression parameters too long, length %d cannot be above 65535.\",\n                        parametersBytes.length));\n        out.putShort((short) parametersBytes.length);\n        updateChecksumInt(crc, parametersBytes.length);\n        out.put(parametersBytes);\n        crc.update(parametersBytes, 0, parametersBytes.length);\n        out.putInt((int) crc.getValue());\n    }\n\n    @VisibleForTesting\n    static String constructParametersString(ParameterizedClass compression, EncryptionContext encryptionContext, Map<String, String> additionalHeaders)\n    {\n        Map<String, Object> params = new TreeMap<>();\n        if (compression != null)\n        {\n            params.put(COMPRESSION_PARAMETERS_KEY, compression.parameters);\n            params.put(COMPRESSION_CLASS_KEY, compression.class_name);\n        }\n        if (encryptionContext != null)","sourceCodeStart":94,"sourceCodeEnd":130,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/db/commitlog/CommitLogDescriptor.java#L94-L130","documentation":"CommitLogDescriptor.writeHeader serializes the segment's compression/encryption parameters as a UTF-8 string, whose length is written as an unsigned short (max 65535 bytes). If the parameters string exceeds that, a ConfigurationException is thrown so the header is never written in a form that could not be read back.","triggerScenarios":"Opening a new commit log segment (writeHeader, via writeHeader-fromHeader path) with a descriptor whose combined compression + encryption + additionalHeaders parameters string exceeds 65535 UTF-8 bytes — typically thousands of compression option entries.","commonSituations":"cassandra.yaml compression or encryption_context options bloated with very large maps (e.g. many chunk_length/iv parameters or an enormous parameter map injected programmatically in tests).","solutions":["Trim the compression/encryption parameter map in cassandra.yaml (or the CompressionParams/EncryptionContext built programmatically) to a sane size.","Remove duplicate or obsolete keys from compression_options / encryption_options.","If building descriptors in tests, generate fewer additionalHeaders so the serialized string stays under 65535 bytes.","Shorten long custom parameter values (e.g. long keystore paths or embedded config blobs)."],"exampleFix":"// before\nMap<String,String> opts = hugeGeneratedOptionMap; // thousands of entries -> ConfigurationException\n// after\nMap<String,String> opts = Map.of(\"class_name\", \"LZ4Compressor\", \"chunk_length_in_kb\", \"16\");","handlingStrategy":"validation","validationCode":"String s = descriptor.parametersAsCreateString(); // or serialize yourself\nif (s.getBytes(StandardCharsets.UTF_8).length > 65535)\n    throw new IllegalArgumentException(\"Compression/encryption parameters too long for commit log header\");","typeGuard":null,"tryCatchPattern":"try (CommitLogSegmentFile f = open(descriptor)) { ... } catch (ConfigurationException e) { logger.error(\"Header params too large: {}\", e.getMessage()); }","preventionTips":["Keep compression_options small and explicit","Do not inject large blob-like values into compression/encryption config","Review generated test descriptors for oversized additional headers"],"tags":["commitlog","header","limit","compression"],"backgroundTag":"file-size-limit-exceeded","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"}