Search in sources :

Example 21 with ClusterSettings

use of com.mongodb.connection.ClusterSettings in project mongo-java-driver by mongodb.

the class LoadBalancedClusterTest method shouldFailSelectServerAsynchronouslyWhenThereIsSRVMisconfiguration.

@Test
public void shouldFailSelectServerAsynchronouslyWhenThereIsSRVMisconfiguration() {
    // given
    String srvHostName = "foo.bar.com";
    ClusterSettings clusterSettings = ClusterSettings.builder().mode(ClusterConnectionMode.LOAD_BALANCED).srvHost(srvHostName).build();
    ClusterableServerFactory serverFactory = mockServerFactory();
    DnsSrvRecordMonitorFactory dnsSrvRecordMonitorFactory = mock(DnsSrvRecordMonitorFactory.class);
    when(dnsSrvRecordMonitorFactory.create(eq(srvHostName), eq(clusterSettings.getSrvServiceName()), any())).thenAnswer(invocation -> new TestDnsSrvRecordMonitor(invocation.getArgument(2)).hosts(Arrays.asList(new ServerAddress("host1"), new ServerAddress("host2"))));
    cluster = new LoadBalancedCluster(new ClusterId(), clusterSettings, serverFactory, dnsSrvRecordMonitorFactory);
    FutureResultCallback<ServerTuple> callback = new FutureResultCallback<>();
    cluster.selectServerAsync(mock(ServerSelector.class), callback);
    MongoClientException exception = assertThrows(MongoClientException.class, callback::get);
    assertEquals("In load balancing mode, the host must resolve to a single SRV record, but instead it resolved to multiple hosts", exception.getMessage());
}
Also used : FutureResultCallback(com.mongodb.async.FutureResultCallback) ClusterSettings(com.mongodb.connection.ClusterSettings) MongoClientException(com.mongodb.MongoClientException) ClusterId(com.mongodb.connection.ClusterId) ServerAddress(com.mongodb.ServerAddress) ServerSelector(com.mongodb.selector.ServerSelector) RepeatedTest(org.junit.jupiter.api.RepeatedTest) Test(org.junit.jupiter.api.Test)

Example 22 with ClusterSettings

use of com.mongodb.connection.ClusterSettings in project mongo-java-driver by mongodb.

the class LoadBalancedClusterTest method asynchronousConcurrentTest.

@RepeatedTest(value = 10, name = RepeatedTest.LONG_DISPLAY_NAME)
@Tag("Slow")
public void asynchronousConcurrentTest() throws InterruptedException, ExecutionException, TimeoutException {
    String srvHostName = "foo.bar.com";
    ServerAddress resolvedServerAddress = new ServerAddress("host1");
    ClusterableServer expectedServer = mock(ClusterableServer.class);
    ClusterSettings clusterSettings = ClusterSettings.builder().serverSelectionTimeout(5, MILLISECONDS).mode(ClusterConnectionMode.LOAD_BALANCED).srvHost(srvHostName).build();
    ClusterableServerFactory serverFactory = mockServerFactory(resolvedServerAddress, expectedServer);
    Duration srvResolutionTime = Duration.ofSeconds(5);
    DnsSrvRecordMonitorFactory dnsSrvRecordMonitorFactory = mock(DnsSrvRecordMonitorFactory.class);
    AtomicReference<TestDnsSrvRecordMonitor> dnsSrvRecordMonitorReference = new AtomicReference<>();
    when(dnsSrvRecordMonitorFactory.create(eq(srvHostName), eq(clusterSettings.getSrvServiceName()), any())).thenAnswer(invocation -> {
        TestDnsSrvRecordMonitor dnsSrvRecordMonitor = new TestDnsSrvRecordMonitor(invocation.getArgument(2)).sleepTime(srvResolutionTime);
        dnsSrvRecordMonitorReference.set(dnsSrvRecordMonitor);
        return dnsSrvRecordMonitor;
    });
    cluster = new LoadBalancedCluster(new ClusterId(), clusterSettings, serverFactory, dnsSrvRecordMonitorFactory);
    int numThreads = 10;
    List<List<FutureResultCallback<ServerTuple>>> callbacksList = new ArrayList<>(numThreads);
    ExecutorService executorService = Executors.newFixedThreadPool(numThreads);
    List<Future<?>> futures = new ArrayList<>(numThreads);
    for (int i = 0; i < numThreads; i++) {
        List<FutureResultCallback<ServerTuple>> callbacks = new ArrayList<>();
        callbacksList.add(callbacks);
        futures.add(executorService.submit(() -> {
            while (!dnsSrvRecordMonitorReference.get().isInitialized()) {
                FutureResultCallback<ServerTuple> callback = new FutureResultCallback<>();
                callbacks.add(callback);
                cluster.selectServerAsync(mock(ServerSelector.class), callback);
            }
            // Keep going for a little while
            for (int j = 0; j < 100; j++) {
                FutureResultCallback<ServerTuple> callback = new FutureResultCallback<>();
                callbacks.add(callback);
                cluster.selectServerAsync(mock(ServerSelector.class), callback);
            }
        }));
    }
    for (Future<?> future : futures) {
        future.get(10, SECONDS);
    }
    executorService.shutdownNow();
    for (List<FutureResultCallback<ServerTuple>> callbacks : callbacksList) {
        boolean foundFirstNonExceptionResult = false;
        for (FutureResultCallback<ServerTuple> curCallback : callbacks) {
            assertFalse(curCallback.wasInvokedMultipleTimes());
            assertTrue(curCallback.isDone());
            if (!curCallback.isCompletedExceptionally()) {
                foundFirstNonExceptionResult = true;
            }
            if (foundFirstNonExceptionResult) {
                assertFalse(curCallback.isCompletedExceptionally());
            }
        }
    }
}
Also used : FutureResultCallback(com.mongodb.async.FutureResultCallback) ClusterSettings(com.mongodb.connection.ClusterSettings) ServerAddress(com.mongodb.ServerAddress) ArrayList(java.util.ArrayList) ArrayList(java.util.ArrayList) List(java.util.List) ClusterId(com.mongodb.connection.ClusterId) Duration(java.time.Duration) AtomicReference(java.util.concurrent.atomic.AtomicReference) ExecutorService(java.util.concurrent.ExecutorService) Future(java.util.concurrent.Future) RepeatedTest(org.junit.jupiter.api.RepeatedTest) Tag(org.junit.jupiter.api.Tag)

Example 23 with ClusterSettings

use of com.mongodb.connection.ClusterSettings in project mongo-java-driver by mongodb.

the class LoadBalancedClusterTest method shouldTimeoutSelectServerAsynchronouslyWhenThereIsSRVLookupException.

@Test
public void shouldTimeoutSelectServerAsynchronouslyWhenThereIsSRVLookupException() {
    // given
    String srvHostName = "foo.bar.com";
    ServerAddress resolvedServerAddress = new ServerAddress("host1");
    ClusterableServer expectedServer = mock(ClusterableServer.class);
    ClusterSettings clusterSettings = ClusterSettings.builder().serverSelectionTimeout(10, MILLISECONDS).mode(ClusterConnectionMode.LOAD_BALANCED).srvHost(srvHostName).build();
    ClusterableServerFactory serverFactory = mockServerFactory(resolvedServerAddress, expectedServer);
    DnsSrvRecordMonitorFactory dnsSrvRecordMonitorFactory = mock(DnsSrvRecordMonitorFactory.class);
    when(dnsSrvRecordMonitorFactory.create(eq(srvHostName), eq(clusterSettings.getSrvServiceName()), any())).thenAnswer(invocation -> new TestDnsSrvRecordMonitor(invocation.getArgument(2)).sleepTime(Duration.ofMillis(1)).exception(new MongoConfigurationException("Unable to resolve SRV record")));
    cluster = new LoadBalancedCluster(new ClusterId(), clusterSettings, serverFactory, dnsSrvRecordMonitorFactory);
    FutureResultCallback<ServerTuple> callback = new FutureResultCallback<>();
    cluster.selectServerAsync(mock(ServerSelector.class), callback);
    MongoTimeoutException exception = assertThrows(MongoTimeoutException.class, callback::get);
    assertEquals("Timed out after 10 ms while waiting to resolve SRV records for foo.bar.com. " + "Resolution exception was 'com.mongodb.MongoConfigurationException: Unable to resolve SRV record'", exception.getMessage());
}
Also used : FutureResultCallback(com.mongodb.async.FutureResultCallback) MongoConfigurationException(com.mongodb.MongoConfigurationException) ClusterSettings(com.mongodb.connection.ClusterSettings) ClusterId(com.mongodb.connection.ClusterId) ServerAddress(com.mongodb.ServerAddress) MongoTimeoutException(com.mongodb.MongoTimeoutException) ServerSelector(com.mongodb.selector.ServerSelector) RepeatedTest(org.junit.jupiter.api.RepeatedTest) Test(org.junit.jupiter.api.Test)

Example 24 with ClusterSettings

use of com.mongodb.connection.ClusterSettings in project jnosql-diana-driver by eclipse.

the class MongoDBDocumentConfiguration method getAsyncMongoClient.

private com.mongodb.async.client.MongoClient getAsyncMongoClient(List<ServerAddress> servers) {
    ClusterSettings clusterSettings = ClusterSettings.builder().hosts(servers).build();
    MongoClientSettings settings = MongoClientSettings.builder().clusterSettings(clusterSettings).build();
    return MongoClients.create(settings);
}
Also used : ClusterSettings(com.mongodb.connection.ClusterSettings) MongoClientSettings(com.mongodb.async.client.MongoClientSettings)

Aggregations

ClusterSettings (com.mongodb.connection.ClusterSettings)24 ServerAddress (com.mongodb.ServerAddress)18 ClusterId (com.mongodb.connection.ClusterId)15 RepeatedTest (org.junit.jupiter.api.RepeatedTest)12 Test (org.junit.jupiter.api.Test)10 FutureResultCallback (com.mongodb.async.FutureResultCallback)6 ServerSelector (com.mongodb.selector.ServerSelector)6 MongoTimeoutException (com.mongodb.MongoTimeoutException)5 ConnectionString (com.mongodb.ConnectionString)4 MongoClientSettings (com.mongodb.async.client.MongoClientSettings)4 ConnectionPoolSettings (com.mongodb.connection.ConnectionPoolSettings)3 ServerSettings (com.mongodb.connection.ServerSettings)3 SocketSettings (com.mongodb.connection.SocketSettings)3 ArrayList (java.util.ArrayList)3 MongoClientException (com.mongodb.MongoClientException)2 MongoConfigurationException (com.mongodb.MongoConfigurationException)2 MongoCredential (com.mongodb.MongoCredential)2 Builder (com.mongodb.async.client.MongoClientSettings.Builder)2 SslSettings (com.mongodb.connection.SslSettings)2 Duration (java.time.Duration)2