This is an automated email from the ASF dual-hosted git repository. joscorbe pushed a commit to branch OAK-11838 in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git
commit 89c062e454cd4d0d87de3c0c4a09098014e32bac Author: Jose Cordero <corde...@adobe.com> AuthorDate: Mon Aug 4 15:04:43 2025 +0200 OAK-11838: DocumentNodeStoreService.registerNodeStore() ignores Mongo settings --- .../document/mongo/MongoConnectionTest.java | 162 ++++++++++++++++++++- 1 file changed, 161 insertions(+), 1 deletion(-) diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoConnectionTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoConnectionTest.java index cd2cb7fd8a..0a2f21b103 100644 --- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoConnectionTest.java +++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoConnectionTest.java @@ -16,15 +16,21 @@ */ package org.apache.jackrabbit.oak.plugins.document.mongo; +import com.mongodb.ConnectionString; +import com.mongodb.MongoClientSettings; import com.mongodb.ReadConcern; import com.mongodb.WriteConcern; import com.mongodb.client.MongoClient; import com.mongodb.connection.ClusterDescription; import com.mongodb.connection.ClusterType; +import com.mongodb.connection.ConnectionPoolSettings; +import com.mongodb.connection.ServerSettings; import org.apache.jackrabbit.oak.plugins.document.util.MongoConnection; import org.junit.Test; +import java.util.concurrent.TimeUnit; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -33,6 +39,8 @@ import static org.mockito.Mockito.when; public class MongoConnectionTest { + private boolean DEBUG = false; + @Test public void hasWriteConcern() throws Exception { assertFalse(MongoConnection.hasWriteConcern("mongodb://localhost:27017/foo")); @@ -101,7 +109,7 @@ public class MongoConnectionTest { } private void sufficientWriteConcernSingleNode(WriteConcern w, - boolean sufficient) { + boolean sufficient) { sufficientWriteConcern(w, false, sufficient); } @@ -139,4 +147,156 @@ public class MongoConnectionTest { when(client.getClusterDescription()).thenReturn(description); return client; } + + @Test + public void testMongoConnectionGetDefaultBuilderUsesOakDefaults() { + String testUri = "mongodb://localhost:27017/testdb"; + ConnectionString mongoURI = new ConnectionString(testUri); + + MongoClientSettings settings = MongoConnection.getDefaultBuilder() + .applyConnectionString(mongoURI) + .build(); + + ConnectionPoolSettings poolSettings = settings.getConnectionPoolSettings(); + ServerSettings serverSettings = settings.getServerSettings(); + + // Verify that the settings match Oak MongoConnection.DEFAULT_MAX_WAIT_TIME + assertEquals(60000, (int) poolSettings.getMaxWaitTime(TimeUnit.MILLISECONDS)); + // Verify that the settings match Oak MongoConnection.DEFAULT_HEARTBEAT_FREQUENCY + assertEquals(5000, (int) serverSettings.getHeartbeatFrequency(TimeUnit.MILLISECONDS)); + + String stringSettings = MongoConnection.toString(settings); + assertTrue(stringSettings.contains("maxWaitTime=" + 60000)); + assertTrue(stringSettings.contains("heartbeatFrequency=" + 5000)); + } + + @Test + public void testDocumentNodeStoreServiceUsesMongoDBDefaults() { + String testUri = "mongodb://localhost:27017/testdb"; + ConnectionString mongoURI = new ConnectionString(testUri); + + // OAK-11838: Copied from DocumentNodeStoreService.java registerNodeStore() lines 353-356: + MongoClientSettings settings = MongoClientSettings.builder() + .applyConnectionString(mongoURI) + .build(); + + ConnectionPoolSettings poolSettings = settings.getConnectionPoolSettings(); + ServerSettings serverSettings = settings.getServerSettings(); + + // Uses MongoDB driver defaults (120000), instead of Oak defaults + assertEquals(120000, (int) poolSettings.getMaxWaitTime(TimeUnit.MILLISECONDS)); + // Uses MongoDB driver defaults (10000), instead of Oak defaults + assertEquals(10000, (int) serverSettings.getHeartbeatFrequency(TimeUnit.MILLISECONDS)); + + String stringSettings = MongoConnection.toString(settings); + assertTrue(stringSettings.contains("maxWaitTime=" + 120000)); + assertTrue(stringSettings.contains("heartbeatFrequency=" + 10000)); + } + + @Test + public void testMongoDBDriverConnectionStringParameters() { + // This test verifies that the MongoDB driver connection string parameters + // values are randomly set to ensure they are properly applied. + int heartbeatFrequency = 5144; + int maxIdleTime = 11221; + int minPoolSize = 23; + int maxPoolSize = 78; + + String testUri = "mongodb://localhost:27017/testdb" + + "?heartbeatFrequencyMS=" + heartbeatFrequency + + "&maxIdleTimeMS=" + maxIdleTime + + "&minPoolSize=" + minPoolSize + + "&maxPoolSize=" + maxPoolSize; + ConnectionString mongoURI = new ConnectionString(testUri); + + MongoClientSettings mongoSettings = MongoClientSettings.builder() + .applyConnectionString(mongoURI) + .build(); + + ConnectionPoolSettings mongoPoolSettings = mongoSettings.getConnectionPoolSettings(); + ServerSettings mongoServerSettings = mongoSettings.getServerSettings(); + + // Assert all the connection string parameters are correctly applied + assertEquals(heartbeatFrequency, (int) mongoServerSettings.getHeartbeatFrequency(TimeUnit.MILLISECONDS)); + assertEquals(maxIdleTime, (int) mongoPoolSettings.getMaxConnectionIdleTime(TimeUnit.MILLISECONDS)); + assertEquals(minPoolSize, mongoPoolSettings.getMinSize()); + assertEquals(maxPoolSize, mongoPoolSettings.getMaxSize()); + + if (DEBUG) { + System.out.println("=== testMongoDBDriverConnectionStringParameters ==="); + System.out.println("heartbeatFrequency: " + mongoServerSettings.getHeartbeatFrequency(TimeUnit.MILLISECONDS)); + System.out.println("maxIdleTime: " + mongoPoolSettings.getMaxConnectionIdleTime(TimeUnit.MILLISECONDS)); + System.out.println("minPoolSize: " + mongoPoolSettings.getMinSize()); + System.out.println("maxPoolSize: " + mongoPoolSettings.getMaxSize()); + System.out.println("Settings: " + MongoConnection.toString(mongoSettings)); + } + } + + @Test + public void testMongoDBDriverProgrammaticParameters() { + // This test verifies that MongoDB driver parameters can be set programmatically + // using builder methods with randomized but sensible values. + int connectTimeout = 8765; + int socketTimeout = 15432; + int maxWaitTime = 45000; + int maxConnectionLifeTime = 61442; + int maintenanceInitialDelay = 2234; + int maintenanceFrequency = 28102; + int heartbeatFrequency = 7890; + int maxIdleTime = 18543; + int minPoolSize = 12; + int maxPoolSize = 67; + + String testUri = "mongodb://localhost:27017/testdb"; + ConnectionString mongoURI = new ConnectionString(testUri); + + MongoClientSettings mongoSettings = MongoClientSettings.builder() + .applyConnectionString(mongoURI) + .applyToSocketSettings(builder -> builder + .connectTimeout(connectTimeout, TimeUnit.MILLISECONDS) + .readTimeout(socketTimeout, TimeUnit.MILLISECONDS)) + .applyToConnectionPoolSettings(builder -> builder + .maxWaitTime(maxWaitTime, TimeUnit.MILLISECONDS) + .maxConnectionLifeTime(maxConnectionLifeTime, TimeUnit.MILLISECONDS) + .maintenanceInitialDelay(maintenanceInitialDelay, TimeUnit.MILLISECONDS) + .maintenanceFrequency(maintenanceFrequency, TimeUnit.MILLISECONDS) + .maxConnectionIdleTime(maxIdleTime, TimeUnit.MILLISECONDS) + .minSize(minPoolSize) + .maxSize(maxPoolSize)) + .applyToServerSettings(builder -> builder + .heartbeatFrequency(heartbeatFrequency, TimeUnit.MILLISECONDS)) + .build(); + + ConnectionPoolSettings mongoPoolSettings = mongoSettings.getConnectionPoolSettings(); + ServerSettings mongoServerSettings = mongoSettings.getServerSettings(); + + // Assert programmatically set parameters + assertEquals(connectTimeout, mongoSettings.getSocketSettings().getConnectTimeout(TimeUnit.MILLISECONDS)); + assertEquals(socketTimeout, mongoSettings.getSocketSettings().getReadTimeout(TimeUnit.MILLISECONDS)); + assertEquals(maxWaitTime, mongoPoolSettings.getMaxWaitTime(TimeUnit.MILLISECONDS)); + assertEquals(maxConnectionLifeTime, mongoPoolSettings.getMaxConnectionLifeTime(TimeUnit.MILLISECONDS)); + assertEquals(maintenanceInitialDelay, mongoPoolSettings.getMaintenanceInitialDelay(TimeUnit.MILLISECONDS)); + assertEquals(maintenanceFrequency, mongoPoolSettings.getMaintenanceFrequency(TimeUnit.MILLISECONDS)); + + // Assert the 4 parameters that were also in the connection string test + assertEquals(heartbeatFrequency, (int) mongoServerSettings.getHeartbeatFrequency(TimeUnit.MILLISECONDS)); + assertEquals(maxIdleTime, (int) mongoPoolSettings.getMaxConnectionIdleTime(TimeUnit.MILLISECONDS)); + assertEquals(minPoolSize, mongoPoolSettings.getMinSize()); + assertEquals(maxPoolSize, mongoPoolSettings.getMaxSize()); + + if (DEBUG) { + System.out.println("=== testMongoDBDriverProgrammaticParameters ==="); + System.out.println("connectTimeout: " + mongoSettings.getSocketSettings().getConnectTimeout(TimeUnit.MILLISECONDS)); + System.out.println("socketTimeout: " + mongoSettings.getSocketSettings().getReadTimeout(TimeUnit.MILLISECONDS)); + System.out.println("maxWaitTime: " + mongoPoolSettings.getMaxWaitTime(TimeUnit.MILLISECONDS)); + System.out.println("maxConnectionLifeTime: " + mongoPoolSettings.getMaxConnectionLifeTime(TimeUnit.MILLISECONDS)); + System.out.println("maintenanceInitialDelay: " + mongoPoolSettings.getMaintenanceInitialDelay(TimeUnit.MILLISECONDS)); + System.out.println("maintenanceFrequency: " + mongoPoolSettings.getMaintenanceFrequency(TimeUnit.MILLISECONDS)); + System.out.println("heartbeatFrequency: " + mongoServerSettings.getHeartbeatFrequency(TimeUnit.MILLISECONDS)); + System.out.println("maxIdleTime: " + mongoPoolSettings.getMaxConnectionIdleTime(TimeUnit.MILLISECONDS)); + System.out.println("minPoolSize: " + mongoPoolSettings.getMinSize()); + System.out.println("maxPoolSize: " + mongoPoolSettings.getMaxSize()); + System.out.println("Settings: " + MongoConnection.toString(mongoSettings)); + } + } }