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 NOTHING

View on GitHub (pinned to e1c734241f)

Solutions

  1. Remove snappy from quarkus.mongodb.compressors (use zlib instead, which is supported in native mode)
  2. Use the JVM mode (java -jar) where snappy compression works normally
  3. 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

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


AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05). Data as JSON: /api/errors/6153c6155d6629ae. Report an issue: GitHub.