Search in sources :

Example 1 with ConcurrentLongHashMap

use of com.yahoo.pulsar.common.util.collections.ConcurrentLongHashMap in project pulsar by yahoo.

the class ConcurrentLongHashMapTest method testComputeIfAbsent.

@Test
public void testComputeIfAbsent() {
    ConcurrentLongHashMap<Integer> map = new ConcurrentLongHashMap<>(16, 1);
    AtomicInteger counter = new AtomicInteger();
    LongFunction<Integer> provider = new LongFunction<Integer>() {

        public Integer apply(long key) {
            return counter.getAndIncrement();
        }
    };
    assertEquals(map.computeIfAbsent(0, provider).intValue(), 0);
    assertEquals(map.get(0).intValue(), 0);
    assertEquals(map.computeIfAbsent(1, provider).intValue(), 1);
    assertEquals(map.get(1).intValue(), 1);
    assertEquals(map.computeIfAbsent(1, provider).intValue(), 1);
    assertEquals(map.get(1).intValue(), 1);
    assertEquals(map.computeIfAbsent(2, provider).intValue(), 2);
    assertEquals(map.get(2).intValue(), 2);
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) LongFunction(java.util.function.LongFunction) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ConcurrentLongHashMap(com.yahoo.pulsar.common.util.collections.ConcurrentLongHashMap) Test(org.testng.annotations.Test)

Example 2 with ConcurrentLongHashMap

use of com.yahoo.pulsar.common.util.collections.ConcurrentLongHashMap in project pulsar by yahoo.

the class BrokerClientIntegrationTest method testDisconnectClientWithoutClosingConnection.

/**
     * Verifies unload namespace-bundle doesn't close shared connection used by other namespace-bundle.
     * <pre>
     * 1. after disabling broker fron loadbalancer
     * 2. unload namespace-bundle "my-ns1" which disconnects client (producer/consumer) connected on that namespacebundle
     * 3. but doesn't close the connection for namesapce-bundle "my-ns2" and clients are still connected
     * 4. verifies unloaded "my-ns1" should not connected again with the broker as broker is disabled
     * 5. unload "my-ns2" which closes the connection as broker doesn't have any more client connected on that connection
     * 6. all namespace-bundles are in "connecting" state and waiting for available broker
     * </pre>
     * 
     * @throws Exception
     */
@Test
public void testDisconnectClientWithoutClosingConnection() throws Exception {
    final String ns1 = "my-property/use/con-ns1";
    final String ns2 = "my-property/use/con-ns2";
    admin.namespaces().createNamespace(ns1);
    admin.namespaces().createNamespace(ns2);
    final String dn1 = "persistent://" + ns1 + "/my-topic";
    final String dn2 = "persistent://" + ns2 + "/my-topic";
    ConsumerImpl cons1 = (ConsumerImpl) pulsarClient.subscribe(dn1, "my-subscriber-name", new ConsumerConfiguration());
    ProducerImpl prod1 = (ProducerImpl) pulsarClient.createProducer(dn1, new ProducerConfiguration());
    ProducerImpl prod2 = (ProducerImpl) pulsarClient.createProducer(dn2, new ProducerConfiguration());
    ConsumerImpl consumer1 = spy(cons1);
    doAnswer(invocationOnMock -> cons1.getState()).when(consumer1).getState();
    doAnswer(invocationOnMock -> cons1.getClientCnx()).when(consumer1).getClientCnx();
    doAnswer(invocationOnMock -> cons1.cnx()).when(consumer1).cnx();
    doAnswer(invocationOnMock -> {
        cons1.connectionClosed((ClientCnx) invocationOnMock.getArguments()[0]);
        return null;
    }).when(consumer1).connectionClosed(anyObject());
    ProducerImpl producer1 = spy(prod1);
    doAnswer(invocationOnMock -> prod1.getState()).when(producer1).getState();
    doAnswer(invocationOnMock -> prod1.getClientCnx()).when(producer1).getClientCnx();
    doAnswer(invocationOnMock -> prod1.cnx()).when(producer1).cnx();
    doAnswer(invocationOnMock -> {
        prod1.connectionClosed((ClientCnx) invocationOnMock.getArguments()[0]);
        return null;
    }).when(producer1).connectionClosed(anyObject());
    ProducerImpl producer2 = spy(prod2);
    doAnswer(invocationOnMock -> prod2.getState()).when(producer2).getState();
    doAnswer(invocationOnMock -> prod2.getClientCnx()).when(producer2).getClientCnx();
    doAnswer(invocationOnMock -> prod2.cnx()).when(producer2).cnx();
    doAnswer(invocationOnMock -> {
        prod2.connectionClosed((ClientCnx) invocationOnMock.getArguments()[0]);
        return null;
    }).when(producer2).connectionClosed(anyObject());
    ClientCnx clientCnx = producer1.getClientCnx();
    Field pfield = ClientCnx.class.getDeclaredField("producers");
    pfield.setAccessible(true);
    Field cfield = ClientCnx.class.getDeclaredField("consumers");
    cfield.setAccessible(true);
    ConcurrentLongHashMap<ProducerImpl> producers = (ConcurrentLongHashMap<ProducerImpl>) pfield.get(clientCnx);
    ConcurrentLongHashMap<ConsumerImpl> consumers = (ConcurrentLongHashMap<ConsumerImpl>) cfield.get(clientCnx);
    producers.put(2, producers.get(0));
    producers.put(3, producers.get(1));
    consumers.put(1, consumers.get(0));
    producers.put(0, producer1);
    producers.put(1, producer2);
    consumers.put(0, consumer1);
    // disable this broker to avoid any new requests
    pulsar.getLoadManager().disableBroker();
    NamespaceBundle bundle1 = pulsar.getNamespaceService().getBundle(DestinationName.get(dn1));
    NamespaceBundle bundle2 = pulsar.getNamespaceService().getBundle(DestinationName.get(dn2));
    // unload ns-bundle:1
    pulsar.getNamespaceService().unloadNamespaceBundle((NamespaceBundle) bundle1);
    // let server send signal to close-connection and client close the connection
    Thread.sleep(1000);
    // [1] Verify: producer1 must get connectionClosed signal
    verify(producer1, atLeastOnce()).connectionClosed(anyObject());
    // [2] Verify: consumer1 must get connectionClosed signal
    verify(consumer1, atLeastOnce()).connectionClosed(anyObject());
    // [3] Verify: producer2 should have not received connectionClosed signal
    verify(producer2, never()).connectionClosed(anyObject());
    // sleep for sometime to let other disconnected producer and consumer connect again: but they should not get
    // connected with same broker as that broker is already out from active-broker list
    Thread.sleep(200);
    // producer1 must not be able to connect again
    assertTrue(prod1.getClientCnx() == null);
    assertTrue(prod1.getState().equals(State.Connecting));
    // consumer1 must not be able to connect again
    assertTrue(cons1.getClientCnx() == null);
    assertTrue(cons1.getState().equals(State.Connecting));
    // producer2 must have live connection
    assertTrue(prod2.getClientCnx() != null);
    assertTrue(prod2.getState().equals(State.Ready));
    // unload ns-bundle2 as well
    pulsar.getNamespaceService().unloadNamespaceBundle((NamespaceBundle) bundle2);
    verify(producer2, atLeastOnce()).connectionClosed(anyObject());
    Thread.sleep(200);
    // producer1 must not be able to connect again
    assertTrue(prod1.getClientCnx() == null);
    assertTrue(prod1.getState().equals(State.Connecting));
    // consumer1 must not be able to connect again
    assertTrue(cons1.getClientCnx() == null);
    assertTrue(cons1.getState().equals(State.Connecting));
    // producer2 must not be able to connect again
    assertTrue(prod2.getClientCnx() == null);
    assertTrue(prod2.getState().equals(State.Connecting));
    producer1.close();
    producer2.close();
    consumer1.close();
    prod1.close();
    prod2.close();
    cons1.close();
}
Also used : NamespaceBundle(com.yahoo.pulsar.common.naming.NamespaceBundle) Field(java.lang.reflect.Field) ConsumerConfiguration(com.yahoo.pulsar.client.api.ConsumerConfiguration) ProducerConfiguration(com.yahoo.pulsar.client.api.ProducerConfiguration) ConcurrentLongHashMap(com.yahoo.pulsar.common.util.collections.ConcurrentLongHashMap) Test(org.testng.annotations.Test)

Example 3 with ConcurrentLongHashMap

use of com.yahoo.pulsar.common.util.collections.ConcurrentLongHashMap in project pulsar by yahoo.

the class ConcurrentLongHashMapTest method concurrentInsertionsAndReads.

@Test
public void concurrentInsertionsAndReads() throws Throwable {
    ConcurrentLongHashMap<String> map = new ConcurrentLongHashMap<>();
    ExecutorService executor = Executors.newCachedThreadPool();
    final int nThreads = 16;
    final int N = 100_000;
    String value = "value";
    List<Future<?>> futures = new ArrayList<>();
    for (int i = 0; i < nThreads; i++) {
        final int threadIdx = i;
        futures.add(executor.submit(() -> {
            Random random = new Random();
            for (int j = 0; j < N; j++) {
                long key = random.nextLong();
                // Ensure keys are uniques
                key -= key % (threadIdx + 1);
                map.put(key, value);
            }
        }));
    }
    for (Future<?> future : futures) {
        future.get();
    }
    assertEquals(map.size(), N * nThreads);
    executor.shutdown();
}
Also used : Random(java.util.Random) ExecutorService(java.util.concurrent.ExecutorService) ArrayList(java.util.ArrayList) Future(java.util.concurrent.Future) ConcurrentLongHashMap(com.yahoo.pulsar.common.util.collections.ConcurrentLongHashMap) Test(org.testng.annotations.Test)

Example 4 with ConcurrentLongHashMap

use of com.yahoo.pulsar.common.util.collections.ConcurrentLongHashMap in project pulsar by yahoo.

the class ConcurrentLongHashMapTest method concurrentInsertions.

@Test
public void concurrentInsertions() throws Throwable {
    ConcurrentLongHashMap<String> map = new ConcurrentLongHashMap<>();
    ExecutorService executor = Executors.newCachedThreadPool();
    final int nThreads = 16;
    final int N = 100_000;
    String value = "value";
    List<Future<?>> futures = new ArrayList<>();
    for (int i = 0; i < nThreads; i++) {
        final int threadIdx = i;
        futures.add(executor.submit(() -> {
            Random random = new Random();
            for (int j = 0; j < N; j++) {
                long key = random.nextLong();
                // Ensure keys are uniques
                key -= key % (threadIdx + 1);
                map.put(key, value);
            }
        }));
    }
    for (Future<?> future : futures) {
        future.get();
    }
    assertEquals(map.size(), N * nThreads);
    executor.shutdown();
}
Also used : Random(java.util.Random) ExecutorService(java.util.concurrent.ExecutorService) ArrayList(java.util.ArrayList) Future(java.util.concurrent.Future) ConcurrentLongHashMap(com.yahoo.pulsar.common.util.collections.ConcurrentLongHashMap) Test(org.testng.annotations.Test)

Aggregations

ConcurrentLongHashMap (com.yahoo.pulsar.common.util.collections.ConcurrentLongHashMap)4 Test (org.testng.annotations.Test)4 ArrayList (java.util.ArrayList)2 Random (java.util.Random)2 ExecutorService (java.util.concurrent.ExecutorService)2 Future (java.util.concurrent.Future)2 ConsumerConfiguration (com.yahoo.pulsar.client.api.ConsumerConfiguration)1 ProducerConfiguration (com.yahoo.pulsar.client.api.ProducerConfiguration)1 NamespaceBundle (com.yahoo.pulsar.common.naming.NamespaceBundle)1 Field (java.lang.reflect.Field)1 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)1 LongFunction (java.util.function.LongFunction)1