{"record":{"id":"6153c6155d6629ae","repo":"quarkusio/quarkus","slug":"unsupported-operation-snappy","errorCode":null,"errorMessage":"Unsupported operation - snappy","messagePattern":"Unsupported operation - snappy","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"extensions/mongodb-client/runtime/src/main/java/io/quarkus/mongodb/runtime/graal/MongoClientSubstitutions.java","lineNumber":41,"sourceCode":"import com.mongodb.internal.connection.SocketStreamFactory;\nimport com.mongodb.internal.connection.Stream;\nimport com.mongodb.internal.connection.UnixSocketChannelStream;\nimport com.mongodb.lang.Nullable;\nimport com.mongodb.spi.dns.InetAddressResolver;\nimport com.oracle.svm.core.annotate.Alias;\nimport com.oracle.svm.core.annotate.Delete;\nimport com.oracle.svm.core.annotate.Substitute;\nimport com.oracle.svm.core.annotate.TargetClass;\n\npublic final class MongoClientSubstitutions {\n}\n\n@TargetClass(MongoCompressor.class)\nfinal class MongoCompressorSubstitution {\n\n    @Substitute\n    public static MongoCompressor createSnappyCompressor() {\n        throw new UnsupportedOperationException(\"Unsupported operation - snappy\");\n    }\n\n}\n\n@TargetClass(ConnectionString.class)\nfinal class ConnectionStringSubstitution {\n\n    @Substitute\n    private List<MongoCompressor> buildCompressors(final String compressors, @Nullable final Integer zlibCompressionLevel) {\n        List<MongoCompressor> compressorsList = new ArrayList<>();\n\n        for (String cur : compressors.split(\",\")) {\n            if (cur.equals(\"zlib\")) {\n                MongoCompressor zlibCompressor = MongoCompressor.createZlibCompressor();\n                zlibCompressor = zlibCompressor.withProperty(MongoCompressor.LEVEL, zlibCompressionLevel);\n                compressorsList.add(zlibCompressor);\n            } else if (cur.equals(\"snappy\")) {\n                // DO NOTHING","sourceCodeStart":23,"sourceCodeEnd":59,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/mongodb-client/runtime/src/main/java/io/quarkus/mongodb/runtime/graal/MongoClientSubstitutions.java#L23-L59","documentation":"Quarkus's MongoDB client Graal substitution replaces MongoCompressor.createSnappyCompressor() with a stub that always throws UnsupportedOperationException, because the Snappy native library is not included in native-image builds. This means Snappy compression can never be used when running as a native executable. The JVM (non-native) mode is unaffected.","triggerScenarios":"Running a Quarkus native-image build where the MongoDB driver tries to create a Snappy compressor — e.g. quarkus.mongodb.compressors=snappy, or a connection string containing compressors=snappy, and the driver negotiates snappy with a server that supports it.","commonSituations":"Developer configures snappy compression locally (works in JVM/dev mode) then builds a native executable and hits the failure at runtime when connecting to MongoDB Atlas or a server advertising snappy in its compressor list.","solutions":["Remove snappy from quarkus.mongodb.compressors (use zlib instead, which is supported in native mode)","Use the JVM mode (java -jar) where snappy compression works normally","Explicitly disable compression (quarkus.mongodb.compressors=none)"],"exampleFix":"// before\nquarkus.mongodb.compressors=snappy\n// after\nquarkus.mongodb.compressors=zlib","handlingStrategy":"validation","validationCode":"List<String> compressors = config.getValue(\"quarkus.mongodb.compressors\", ...);\nif (isNativeImage() && compressors.contains(\"snappy\")) {\n    throw new IllegalStateException(\"snappy compressor is not supported in native mode; use zlib\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    mongoClient = MongoClients.create(settings);\n} catch (UnsupportedOperationException e) {\n    if (e.getMessage().contains(\"snappy\")) {\n        log.warn(\"Falling back to zlib compression\");\n        mongoClient = MongoClients.create(settingsWithoutSnappy);\n    } else throw e;\n}","preventionTips":["Only use zlib in quarkus.mongodb.compressors if you target native mode","Test native builds with the same MongoDB server as JVM mode","Document compression settings separately for JVM vs native profiles"],"tags":["mongodb","graal-native-image","compression","snappy"],"backgroundTag":"mongodb-native-image-unsupported-feature","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}