quarkusio/quarkus · error · UnsupportedOperationException
Unsupported operation - snappy
Error message
Unsupported operation - snappy
What it means
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.
Source
Thrown at extensions/mongodb-client/runtime/src/main/java/io/quarkus/mongodb/runtime/graal/MongoClientSubstitutions.java:41
import com.mongodb.internal.connection.SocketStreamFactory;
import com.mongodb.internal.connection.Stream;
import com.mongodb.internal.connection.UnixSocketChannelStream;
import com.mongodb.lang.Nullable;
import com.mongodb.spi.dns.InetAddressResolver;
import com.oracle.svm.core.annotate.Alias;
import com.oracle.svm.core.annotate.Delete;
import com.oracle.svm.core.annotate.Substitute;
import com.oracle.svm.core.annotate.TargetClass;
public final class MongoClientSubstitutions {
}
@TargetClass(MongoCompressor.class)
final class MongoCompressorSubstitution {
@Substitute
public static MongoCompressor createSnappyCompressor() {
throw new UnsupportedOperationException("Unsupported operation - snappy");
}
}
@TargetClass(ConnectionString.class)
final class ConnectionStringSubstitution {
@Substitute
private List<MongoCompressor> buildCompressors(final String compressors, @Nullable final Integer zlibCompressionLevel) {
List<MongoCompressor> compressorsList = new ArrayList<>();
for (String cur : compressors.split(",")) {
if (cur.equals("zlib")) {
MongoCompressor zlibCompressor = MongoCompressor.createZlibCompressor();
zlibCompressor = zlibCompressor.withProperty(MongoCompressor.LEVEL, zlibCompressionLevel);
compressorsList.add(zlibCompressor);
} else if (cur.equals("snappy")) {
// DO NOTHINGView on GitHub (pinned to e1c734241f)
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)
Example fix
// before quarkus.mongodb.compressors=snappy // after quarkus.mongodb.compressors=zlib
Defensive patterns
Strategy: validation
Validate before calling
List<String> compressors = config.getValue("quarkus.mongodb.compressors", ...);
if (isNativeImage() && compressors.contains("snappy")) {
throw new IllegalStateException("snappy compressor is not supported in native mode; use zlib");
} Try / catch
try {
mongoClient = MongoClients.create(settings);
} catch (UnsupportedOperationException e) {
if (e.getMessage().contains("snappy")) {
log.warn("Falling back to zlib compression");
mongoClient = MongoClients.create(settingsWithoutSnappy);
} else throw e;
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- Unsupported compressor '
- Unsupported compressor in native mode
- Compression cannot be null
- Error while loading the liquibase changelogs: %s
- Config property 'quarkus.mongodb.database' must be defined w
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/6153c6155d6629ae.
Report an issue: GitHub.