{"record":{"id":"8cc688b7473c33d2","repo":"alibaba/canal","slug":"compression-is-not-supported-in-this-connector-8cc688","errorCode":null,"errorMessage":"compression is not supported in this connector","messagePattern":"compression is not supported in this connector","errorType":"exception","errorClass":"CanalClientException","httpStatus":null,"severity":"error","filePath":"connector/core/src/main/java/com/alibaba/otter/canal/connector/core/util/CanalMessageSerializerUtil.java","lineNumber":101,"sourceCode":"        }\n        return null;\n    }\n\n    public static Message deserializer(byte[] data) {\n        return deserializer(data, false);\n    }\n\n    public static Message deserializer(byte[] data, boolean lazyParseEntry) {\n        try {\n            if (data == null) {\n                return null;\n            } else {\n                CanalPacket.Packet p = CanalPacket.Packet.parseFrom(data);\n                switch (p.getType()) {\n                    case MESSAGES: {\n                        if (!p.getCompression().equals(CanalPacket.Compression.NONE)\n                            && !p.getCompression().equals(CanalPacket.Compression.COMPRESSIONCOMPATIBLEPROTO2)) {\n                            throw new CanalClientException(\"compression is not supported in this connector\");\n                        }\n\n                        CanalPacket.Messages messages = CanalPacket.Messages.parseFrom(p.getBody());\n                        Message result = new Message(messages.getBatchId());\n                        if (lazyParseEntry) {\n                            // byteString\n                            result.setRawEntries(messages.getMessagesList());\n                            result.setRaw(true);\n                        } else {\n                            for (ByteString byteString : messages.getMessagesList()) {\n                                result.addEntry(CanalEntry.Entry.parseFrom(byteString));\n                            }\n                            result.setRaw(false);\n                        }\n                        return result;\n                    }\n                    case ACK: {\n                        CanalPacket.Ack ack = CanalPacket.Ack.parseFrom(p.getBody());","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/alibaba/canal/blob/87be50e87686a3e8af08c368d0e1ffd1f59eb04a/connector/core/src/main/java/com/alibaba/otter/canal/connector/core/util/CanalMessageSerializerUtil.java#L83-L119","documentation":"Thrown by CanalMessageSerializerUtil.deserializer when a parsed CanalPacket.Packet reports a Compression value other than NONE or COMPRESSIONCOMPATIBLEPROTO2. The canal client connector does not implement payload decompression, so any non-NONE compression flag is rejected outright (it then gets wrapped by the outer catch into 'deserializer failed by ...').","triggerScenarios":"Receiving a packet whose Compression field is set to a compressed mode; producer/sender and consumer running different canal protocol versions where one side sets compression the other cannot decode; corrupted bytes being misparsed as a Packet with a stray compression enum value.","commonSituations":"Version mismatch between canal server (producer) and client connector (consumer) introducing a compression flag; cross-system interoperability where a non-canal sender populates the Compression field; truncated/corrupt byte array parsed into a bogus Packet.","solutions":["Align canal server and client connector versions so both treat Compression as NONE.","Ensure the byte[] passed to deserializer is a genuine canal Packet produced by CanalMessageSerializerUtil.serializer (not a foreign payload).","Disable any compression flag on the producer side (canal protocol uses NONE)."],"exampleFix":"// before\nbyte[] payload = readFromForeignSource();\ndeserializer(payload, false);  // unsupported compression\n// after\nbyte[] payload = readFromCanalProducer();\ndeserializer(payload, false);  // Compression == NONE","handlingStrategy":"validation","validationCode":"// Inspect packet type/compression before deserializing as MESSAGES\nCanalPacket.Packet p = CanalPacket.Packet.parseFrom(data);\nif (!CanalPacket.Compression.NONE.equals(p.getCompression())\n    && !CanalPacket.Compression.COMPRESSIONCOMPATIBLEPROTO2.equals(p.getCompression())) {\n    throw new CanalClientException(\"unsupported compression: \" + p.getCompression());\n}\nif (p.getType() != CanalPacket.PacketType.MESSAGES) {\n    throw new CanalClientException(\"not a MESSAGES packet: \" + p.getType());\n}","typeGuard":"boolean isDecompressible(CanalPacket.Packet p) {\n    return p.getCompression().equals(CanalPacket.Compression.NONE)\n        || p.getCompression().equals(CanalPacket.Compression.COMPRESSIONCOMPATIBLEPROTO2);\n}","tryCatchPattern":"try {\n    Message m = CanalMessageSerializerUtil.deserializer(data, lazyParse);\n} catch (CanalClientException e) {\n    if (e.getMessage().contains(\"compression is not supported\")) {\n        // version mismatch: align canal server and client versions\n    } else throw e;\n}","preventionTips":["Keep canal server and client connector on the same version.","Only feed genuine canal-produced byte[] into the deserializer.","Ensure the producer never sets a non-NONE Compression flag."],"tags":["serialization","protobuf","version-mismatch","deserialization"],"backgroundTag":null,"analyzedSha":"87be50e87686a3e8af08c368d0e1ffd1f59eb04a","analyzedAt":"2026-08-14T04:30:11.918Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}