Search in sources :

Example 21 with ClusterId

use of com.mongodb.connection.ClusterId 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 22 with ClusterId

use of com.mongodb.connection.ClusterId 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 23 with ClusterId

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

the class LoadBalancedClusterTest method shouldCloseServerWhenClosing.

@Test
void shouldCloseServerWhenClosing() {
    // prepare mocks
    ClusterableServerFactory serverFactory = mock(ClusterableServerFactory.class);
    when(serverFactory.getSettings()).thenReturn(mock(ServerSettings.class));
    ClusterableServer server = mock(ClusterableServer.class);
    when(serverFactory.create(any(), any())).thenReturn(server);
    // create `cluster` and check that it creates a `ClusterableServer`
    LoadBalancedCluster cluster = new LoadBalancedCluster(new ClusterId(), ClusterSettings.builder().mode(ClusterConnectionMode.LOAD_BALANCED).build(), serverFactory, mock(DnsSrvRecordMonitorFactory.class));
    verify(serverFactory, times(1)).create(any(), any());
    // close `cluster` and check that it closes `server`
    cluster.close();
    verify(server, atLeastOnce()).close();
}
Also used : ClusterId(com.mongodb.connection.ClusterId) ServerSettings(com.mongodb.connection.ServerSettings) RepeatedTest(org.junit.jupiter.api.RepeatedTest) Test(org.junit.jupiter.api.Test)

Example 24 with ClusterId

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

the class X509AuthenticatorNoUserNameTest method before.

@Before
public void before() {
    connection = new TestInternalConnection(new ServerId(new ClusterId(), new ServerAddress("localhost", 27017)));
    connectionDescriptionThreeTwo = new ConnectionDescription(new ConnectionId(new ServerId(new ClusterId(), new ServerAddress())), 4, ServerType.STANDALONE, 1000, 16000, 48000, Collections.<String>emptyList());
    connectionDescriptionThreeFour = new ConnectionDescription(new ConnectionId(new ServerId(new ClusterId(), new ServerAddress())), 5, ServerType.STANDALONE, 1000, 16000, 48000, Collections.<String>emptyList());
}
Also used : ConnectionDescription(com.mongodb.connection.ConnectionDescription) ConnectionId(com.mongodb.connection.ConnectionId) ServerId(com.mongodb.connection.ServerId) ClusterId(com.mongodb.connection.ClusterId) ServerAddress(com.mongodb.ServerAddress) Before(org.junit.Before)

Aggregations

ClusterId (com.mongodb.connection.ClusterId)24 ServerAddress (com.mongodb.ServerAddress)19 ClusterSettings (com.mongodb.connection.ClusterSettings)15 RepeatedTest (org.junit.jupiter.api.RepeatedTest)13 Test (org.junit.jupiter.api.Test)12 ServerId (com.mongodb.connection.ServerId)7 Before (org.junit.Before)7 FutureResultCallback (com.mongodb.async.FutureResultCallback)6 ServerSelector (com.mongodb.selector.ServerSelector)6 MongoTimeoutException (com.mongodb.MongoTimeoutException)5 ConnectionDescription (com.mongodb.connection.ConnectionDescription)5 ServerSettings (com.mongodb.connection.ServerSettings)3 MongoClientException (com.mongodb.MongoClientException)2 MongoConfigurationException (com.mongodb.MongoConfigurationException)2 ConnectionId (com.mongodb.connection.ConnectionId)2 Duration (java.time.Duration)2 ArrayList (java.util.ArrayList)2 ExecutorService (java.util.concurrent.ExecutorService)2 Future (java.util.concurrent.Future)2 BsonDocument (org.bson.BsonDocument)2