Search in sources :

Example 16 with SeedNode

use of com.couchbase.client.core.env.SeedNode in project couchbase-jvm-clients by couchbase.

the class DefaultConfigurationProviderTest method handlesMultipleBucketOpenInProgress.

/**
 * Regression test for JVMCBC-880.
 * <p>
 * Verifies that when multiple bucket open attempts happen in parallel, the bucketConfigLoadInProgress method
 * is not returning false prematurely (namely when only one is finished but one is still oustanding).
 */
@Test
void handlesMultipleBucketOpenInProgress() throws Exception {
    Core core = mock(Core.class);
    CoreContext ctx = new CoreContext(core, 1, ENVIRONMENT, mock(Authenticator.class));
    when(core.context()).thenReturn(ctx);
    Set<SeedNode> seedNodes = new HashSet<>(Collections.singletonList(SeedNode.create("127.0.0.1")));
    Sinks.One<ProposedBucketConfigContext> bucket1Barrier = Sinks.one();
    Sinks.One<ProposedBucketConfigContext> bucket2Barrier = Sinks.one();
    ConfigurationProvider cp = new DefaultConfigurationProvider(core, seedNodes) {

        @Override
        protected Mono<ProposedBucketConfigContext> loadBucketConfigForSeed(NodeIdentifier identifier, int mappedKvPort, int mappedManagerPort, String name, Optional<String> alternateAddress) {
            if (name.equals("bucket1")) {
                return bucket1Barrier.asMono();
            } else {
                return bucket2Barrier.asMono();
            }
        }

        @Override
        public void proposeBucketConfig(ProposedBucketConfigContext ctx) {
        }

        @Override
        protected Mono<Void> registerRefresher(String bucket) {
            return Mono.empty();
        }
    };
    assertFalse(cp.bucketConfigLoadInProgress());
    CountDownLatch latch = new CountDownLatch(2);
    cp.openBucket("bucket1").subscribe(unused -> {
    }, Assertions::fail, () -> {
        assertTrue(cp.bucketConfigLoadInProgress());
        latch.countDown();
    });
    cp.openBucket("bucket2").subscribe(unused -> {
    }, Assertions::fail, () -> {
        assertFalse(cp.bucketConfigLoadInProgress());
        latch.countDown();
    });
    // we pretend bucket 1 takes 1ms, while bucket2 takes 200ms
    Mono.delay(Duration.ofMillis(1)).subscribe(i -> bucket1Barrier.tryEmitValue(new ProposedBucketConfigContext("bucket1", "{}", "127.0.0.1")));
    Mono.delay(Duration.ofMillis(200)).subscribe(i -> bucket2Barrier.tryEmitValue(new ProposedBucketConfigContext("bucket2", "{}", "127.0.0.1")));
    assertTrue(latch.await(5, TimeUnit.SECONDS));
}
Also used : CoreContext(com.couchbase.client.core.CoreContext) Sinks(reactor.core.publisher.Sinks) Optional(java.util.Optional) SeedNode(com.couchbase.client.core.env.SeedNode) CountDownLatch(java.util.concurrent.CountDownLatch) Assertions(org.junit.jupiter.api.Assertions) NodeIdentifier(com.couchbase.client.core.node.NodeIdentifier) PasswordAuthenticator(com.couchbase.client.core.env.PasswordAuthenticator) Authenticator(com.couchbase.client.core.env.Authenticator) Core(com.couchbase.client.core.Core) HashSet(java.util.HashSet) Test(org.junit.jupiter.api.Test) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest)

Example 17 with SeedNode

use of com.couchbase.client.core.env.SeedNode in project couchbase-jvm-clients by couchbase.

the class DefaultConfigurationProviderTest method ignoresMultipleCollectionIdRefreshAttempts.

/**
 * It is allowed to have multiple attempts in-flight at the same time, but not for the same collection identifier
 * (since this would just spam the cluster unnecessarily).
 */
@Test
void ignoresMultipleCollectionIdRefreshAttempts() {
    Core core = mock(Core.class);
    CoreContext ctx = new CoreContext(core, 1, ENVIRONMENT, mock(Authenticator.class));
    when(core.context()).thenReturn(ctx);
    Set<SeedNode> seedNodes = new HashSet<>(Collections.singletonList(SeedNode.create("127.0.0.1")));
    List<GetCollectionIdRequest> capturedRequests = new ArrayList<>();
    doAnswer(invocation -> {
        capturedRequests.add(invocation.getArgument(0));
        return null;
    }).when(core).send(any(GetCollectionIdRequest.class));
    DefaultConfigurationProvider provider = new DefaultConfigurationProvider(core, seedNodes);
    assertFalse(provider.collectionRefreshInProgress());
    CollectionIdentifier identifier1 = new CollectionIdentifier("bucket", Optional.of("scope"), Optional.of("collection"));
    CollectionIdentifier identifier2 = new CollectionIdentifier("bucket", Optional.of("_default"), Optional.of("_default"));
    provider.refreshCollectionId(identifier1);
    assertEquals(1, provider.collectionMapRefreshInProgress.size());
    assertTrue(provider.collectionMapRefreshInProgress.contains(identifier1));
    provider.refreshCollectionId(identifier2);
    assertEquals(2, provider.collectionMapRefreshInProgress.size());
    assertTrue(provider.collectionMapRefreshInProgress.contains(identifier2));
    provider.refreshCollectionId(identifier2);
    assertEquals(2, provider.collectionMapRefreshInProgress.size());
    assertTrue(provider.collectionMapRefreshInProgress.contains(identifier2));
    boolean found = false;
    for (Event event : EVENT_BUS.publishedEvents()) {
        if (event instanceof CollectionMapRefreshIgnoredEvent) {
            assertEquals(((CollectionMapRefreshIgnoredEvent) event).collectionIdentifier(), identifier2);
            found = true;
        }
    }
    assertTrue(found);
    capturedRequests.get(0).succeed(new GetCollectionIdResponse(ResponseStatus.SUCCESS, Optional.of(1234L)));
    assertTrue(provider.collectionRefreshInProgress());
    capturedRequests.get(1).cancel(CancellationReason.TIMEOUT);
    waitUntilCondition(() -> !provider.collectionRefreshInProgress());
    found = false;
    for (Event event : EVENT_BUS.publishedEvents()) {
        if (event instanceof CollectionMapRefreshFailedEvent) {
            assertEquals(((CollectionMapRefreshFailedEvent) event).collectionIdentifier(), identifier2);
            found = true;
        }
    }
    assertTrue(found);
}
Also used : GetCollectionIdResponse(com.couchbase.client.core.msg.kv.GetCollectionIdResponse) CoreContext(com.couchbase.client.core.CoreContext) SeedNode(com.couchbase.client.core.env.SeedNode) ArrayList(java.util.ArrayList) CollectionMapRefreshIgnoredEvent(com.couchbase.client.core.cnc.events.config.CollectionMapRefreshIgnoredEvent) CollectionMapRefreshFailedEvent(com.couchbase.client.core.cnc.events.config.CollectionMapRefreshFailedEvent) CollectionMapRefreshIgnoredEvent(com.couchbase.client.core.cnc.events.config.CollectionMapRefreshIgnoredEvent) CollectionMapRefreshFailedEvent(com.couchbase.client.core.cnc.events.config.CollectionMapRefreshFailedEvent) Event(com.couchbase.client.core.cnc.Event) GetCollectionIdRequest(com.couchbase.client.core.msg.kv.GetCollectionIdRequest) CollectionIdentifier(com.couchbase.client.core.io.CollectionIdentifier) PasswordAuthenticator(com.couchbase.client.core.env.PasswordAuthenticator) Authenticator(com.couchbase.client.core.env.Authenticator) Core(com.couchbase.client.core.Core) HashSet(java.util.HashSet) Test(org.junit.jupiter.api.Test) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest)

Example 18 with SeedNode

use of com.couchbase.client.core.env.SeedNode in project couchbase-jvm-clients by couchbase.

the class HelloOsgi method seedNodes.

private Set<SeedNode> seedNodes() {
    Set<SeedNode> seedNodes = new HashSet<>();
    SeedNode sn = SeedNode.create(url, Optional.of(11210), Optional.of(8091));
    seedNodes.add(sn);
    return seedNodes;
}
Also used : SeedNode(com.couchbase.client.core.env.SeedNode) HashSet(java.util.HashSet)

Aggregations

SeedNode (com.couchbase.client.core.env.SeedNode)18 HashSet (java.util.HashSet)11 Test (org.junit.jupiter.api.Test)11 Core (com.couchbase.client.core.Core)10 Optional (java.util.Optional)7 CoreContext (com.couchbase.client.core.CoreContext)6 Duration (java.time.Duration)6 Set (java.util.Set)6 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)6 ParameterizedTest (org.junit.jupiter.params.ParameterizedTest)6 CoreEnvironment (com.couchbase.client.core.env.CoreEnvironment)5 CoreIntegrationTest (com.couchbase.client.core.util.CoreIntegrationTest)5 TestNodeConfig (com.couchbase.client.test.TestNodeConfig)5 CountDownLatch (java.util.concurrent.CountDownLatch)5 Event (com.couchbase.client.core.cnc.Event)4 BucketOpenRetriedEvent (com.couchbase.client.core.cnc.events.config.BucketOpenRetriedEvent)4 AlreadyShutdownException (com.couchbase.client.core.error.AlreadyShutdownException)4 BucketNotFoundDuringLoadException (com.couchbase.client.core.error.BucketNotFoundDuringLoadException)4 SimpleEventBus (com.couchbase.client.core.cnc.SimpleEventBus)3 EndpointConnectionFailedEvent (com.couchbase.client.core.cnc.events.endpoint.EndpointConnectionFailedEvent)3