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,

Reply via email to