This is an automated email from the ASF dual-hosted git repository. joscorbe pushed a commit to branch OAK-11835 in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git
commit 0a00f63eabd873d91f665899d2946e967d89c4fc Author: Jose Cordero <corde...@adobe.com> AuthorDate: Tue Aug 5 02:01:36 2025 +0200 OAK-11835: Create MongoClientSettings with all the parameters --- .../plugins/document/mongo/MongoDBConnection.java | 20 ++---- .../mongo/MongoDocumentNodeStoreBuilderBase.java | 82 +++++++++++++++++++--- 2 files changed, 78 insertions(+), 24 deletions(-) diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDBConnection.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDBConnection.java index e922511a1b..243d3b745e 100644 --- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDBConnection.java +++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDBConnection.java @@ -65,23 +65,17 @@ final class MongoDBConnection { static MongoDBConnection newMongoDBConnection(@NotNull String uri, @NotNull String name, @NotNull MongoClock clock, - int socketTimeout) { + @NotNull MongoClientSettings settings) { CompositeServerMonitorListener serverMonitorListener = new CompositeServerMonitorListener(); - MongoClientSettings.Builder options = MongoConnection.getDefaultBuilder(); - options.applyConnectionString(new ConnectionString(uri)); - options.applyToServerSettings(builder -> - builder.addServerMonitorListener(serverMonitorListener) + MongoClientSettings.Builder optionsBuilder = MongoClientSettings.builder(settings); + optionsBuilder.applyToServerSettings(settingsBuilder -> + settingsBuilder.addServerMonitorListener(serverMonitorListener) ); - options.applyToSocketSettings(builder -> { - if (socketTimeout > 0) { - builder.readTimeout(socketTimeout, TimeUnit.MILLISECONDS); - } - }); - MongoClientSettings settings = options.build(); - LOG.info("Mongo Connection details {}", MongoConnection.toString(settings)); - MongoClient client = MongoClients.create(settings); + MongoClientSettings mongoClientSettings = optionsBuilder.build(); + LOG.info("Mongo Connection details {}", MongoConnection.toString(mongoClientSettings)); + MongoClient client = MongoClients.create(mongoClientSettings); MongoStatus status = new MongoStatus(client, name); serverMonitorListener.addListener(status); diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentNodeStoreBuilderBase.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentNodeStoreBuilderBase.java index 0e6115b4a7..1828a780ea 100644 --- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentNodeStoreBuilderBase.java +++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentNodeStoreBuilderBase.java @@ -18,6 +18,8 @@ package org.apache.jackrabbit.oak.plugins.document.mongo; import java.util.concurrent.TimeUnit; +import com.mongodb.ConnectionString; +import com.mongodb.MongoClientSettings; import com.mongodb.client.MongoClient; import org.apache.jackrabbit.oak.plugins.blob.ReferencedBlob; @@ -26,6 +28,7 @@ import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStoreBuilder; import org.apache.jackrabbit.oak.plugins.document.DocumentStore; import org.apache.jackrabbit.oak.plugins.document.MissingLastRevSeeker; import org.apache.jackrabbit.oak.plugins.document.VersionGCSupport; +import org.apache.jackrabbit.oak.plugins.document.util.MongoConnection; import org.jetbrains.annotations.NotNull; import static org.apache.jackrabbit.guava.common.base.Suppliers.memoize; @@ -229,6 +232,72 @@ public abstract class MongoDocumentNodeStoreBuilderBase<T extends MongoDocumentN return leaseSocketTimeout; } + /** + * Builds a configured MongoClientSettings with all settings applied. + * + * @param isLease true for cluster nodes connection, false for default connection pool + * @return fully configured MongoClientSettings + */ + MongoClientSettings buildMongoClientSettings(boolean isLease) { + MongoClientSettings.Builder options = MongoConnection.getDefaultBuilder(); + options.applyConnectionString(new ConnectionString(uri)); + + // Apply socket timeout based on connection type + int socketTimeout; + if (isLease) { + // Cluster nodes connection: use lease socket timeout + socketTimeout = leaseSocketTimeout; + } else { + // Default connection: use OSGi read timeout if configured, otherwise 0 + socketTimeout = readTimeoutMS != null && readTimeoutMS > 0 ? readTimeoutMS : 0; + } + + // Apply connection pool settings + options.applyToConnectionPoolSettings(poolBuilder -> { + if (maxPoolSize != null) poolBuilder.maxSize(maxPoolSize); + if (minPoolSize != null) poolBuilder.minSize(minPoolSize); + if (maxConnecting != null) poolBuilder.maxConnecting(maxConnecting); + if (maxIdleTimeMS != null) { + poolBuilder.maxConnectionIdleTime(maxIdleTimeMS, TimeUnit.MILLISECONDS); + } + if (maxLifeTimeMS != null) { + poolBuilder.maxConnectionLifeTime(maxLifeTimeMS, TimeUnit.MILLISECONDS); + } + if (waitQueueTimeoutMS != null) { + poolBuilder.maxWaitTime(waitQueueTimeoutMS, TimeUnit.MILLISECONDS); + } + }); + + // Apply socket settings + options.applyToSocketSettings(socketBuilder -> { + if (socketTimeout > 0) { + socketBuilder.readTimeout(socketTimeout, TimeUnit.MILLISECONDS); + } + if (connectTimeoutMS != null) { + socketBuilder.connectTimeout(connectTimeoutMS, TimeUnit.MILLISECONDS); + } + }); + + // Apply server settings + options.applyToServerSettings(serverBuilder -> { + if (heartbeatFrequencyMS != null && heartbeatFrequencyMS > 0) { + serverBuilder.heartbeatFrequency(heartbeatFrequencyMS, TimeUnit.MILLISECONDS); + } + if (minHeartbeatFrequencyMS != null && minHeartbeatFrequencyMS > 0) { + serverBuilder.minHeartbeatFrequency(minHeartbeatFrequencyMS, TimeUnit.MILLISECONDS); + } + }); + + // Apply cluster settings + options.applyToClusterSettings(clusterBuilder -> { + if (serverSelectionTimeoutMS != null) { + clusterBuilder.serverSelectionTimeout(serverSelectionTimeoutMS, TimeUnit.MILLISECONDS); + } + }); + + return options.build(); + } + public T setMaxReplicationLag(long duration, TimeUnit unit){ maxReplicationLagMillis = unit.toMillis(duration); return thisBuilder(); @@ -306,17 +375,8 @@ public abstract class MongoDocumentNodeStoreBuilderBase<T extends MongoDocumentN throw new IllegalStateException("Cannot create MongoDB client without 'uri' or 'name'"); } - // Apply correct socket timeout based on connection type - int socketTimeout; - if (isLease) { - // Cluster nodes connection: always use lease socket timeout - socketTimeout = leaseSocketTimeout; - } else { - // Default connection: use OSGi read timeout if configured, otherwise 0 - socketTimeout = readTimeoutMS != null && readTimeoutMS > 0 ? readTimeoutMS : 0; - } - - return newMongoDBConnection(uri, name, mongoClock, socketTimeout); + MongoClientSettings settings = buildMongoClientSettings(isLease); + return newMongoDBConnection(uri, name, mongoClock, settings); } private T setMongoDB(@NotNull MongoDBConnection mongoDBConnection,