Search in sources :

Example 1 with MockServerInfoService

use of com.twitter.distributedlog.client.proxy.MockDistributedLogServices.MockServerInfoService in project distributedlog by twitter.

the class TestProxyClientManager method testPeriodicHandshake.

@Test(timeout = 60000)
public void testPeriodicHandshake() throws Exception {
    final int numHosts = 3;
    final int numStreamsPerHost = 3;
    final int initialPort = 5000;
    MockProxyClientBuilder builder = new MockProxyClientBuilder();
    Map<SocketAddress, ServerInfo> serverInfoMap = new HashMap<SocketAddress, ServerInfo>();
    Map<SocketAddress, MockServerInfoService> mockServiceMap = new HashMap<SocketAddress, MockServerInfoService>();
    final Map<SocketAddress, CountDownLatch> hostDoneLatches = new HashMap<SocketAddress, CountDownLatch>();
    for (int i = 0; i < numHosts; i++) {
        SocketAddress address = createSocketAddress(initialPort + i);
        ServerInfo serverInfo = new ServerInfo();
        for (int j = 0; j < numStreamsPerHost; j++) {
            serverInfo.putToOwnerships(runtime.getMethodName() + "_stream_" + j, address.toString());
        }
        Pair<MockProxyClient, MockServerInfoService> mockProxyClient = createMockProxyClient(address, serverInfo);
        builder.provideProxyClient(address, mockProxyClient.getLeft());
        serverInfoMap.put(address, serverInfo);
        mockServiceMap.put(address, mockProxyClient.getRight());
        hostDoneLatches.put(address, new CountDownLatch(2));
    }
    final Map<SocketAddress, ServerInfo> results = new HashMap<SocketAddress, ServerInfo>();
    final CountDownLatch doneLatch = new CountDownLatch(numHosts);
    ProxyListener listener = new ProxyListener() {

        @Override
        public void onHandshakeSuccess(SocketAddress address, ProxyClient client, ServerInfo serverInfo) {
            synchronized (results) {
                results.put(address, serverInfo);
                CountDownLatch latch = hostDoneLatches.get(address);
                if (null != latch) {
                    latch.countDown();
                }
            }
            doneLatch.countDown();
        }

        @Override
        public void onHandshakeFailure(SocketAddress address, ProxyClient client, Throwable cause) {
        }
    };
    TestHostProvider rs = new TestHostProvider();
    ProxyClientManager clientManager = createProxyClientManager(builder, rs, 50L);
    clientManager.setPeriodicHandshakeEnabled(false);
    clientManager.registerProxyListener(listener);
    assertEquals("There should be no clients in the manager", 0, clientManager.getNumProxies());
    for (int i = 0; i < numHosts; i++) {
        SocketAddress address = createSocketAddress(initialPort + i);
        rs.addHost(address);
        clientManager.createClient(address);
    }
    // make sure the first 3 handshakes going through
    doneLatch.await();
    assertEquals("Handshake should return server info", numHosts, results.size());
    assertTrue("Handshake should get all server infos", Maps.difference(serverInfoMap, results).areEqual());
    // update server info
    for (int i = 0; i < numHosts; i++) {
        SocketAddress address = createSocketAddress(initialPort + i);
        ServerInfo serverInfo = new ServerInfo();
        for (int j = 0; j < numStreamsPerHost; j++) {
            serverInfo.putToOwnerships(runtime.getMethodName() + "_new_stream_" + j, address.toString());
        }
        MockServerInfoService service = mockServiceMap.get(address);
        serverInfoMap.put(address, serverInfo);
        service.updateServerInfo(serverInfo);
    }
    clientManager.setPeriodicHandshakeEnabled(true);
    for (int i = 0; i < numHosts; i++) {
        SocketAddress address = createSocketAddress(initialPort + i);
        CountDownLatch latch = hostDoneLatches.get(address);
        latch.await();
    }
    assertTrue("Periodic handshake should update all server infos", Maps.difference(serverInfoMap, results).areEqual());
}
Also used : HashMap(java.util.HashMap) ServerInfo(com.twitter.distributedlog.thrift.service.ServerInfo) MockServerInfoService(com.twitter.distributedlog.client.proxy.MockDistributedLogServices.MockServerInfoService) MockProxyClient(com.twitter.distributedlog.client.proxy.MockProxyClientBuilder.MockProxyClient) CountDownLatch(java.util.concurrent.CountDownLatch) MockProxyClient(com.twitter.distributedlog.client.proxy.MockProxyClientBuilder.MockProxyClient) SocketAddress(java.net.SocketAddress) InetSocketAddress(java.net.InetSocketAddress) Test(org.junit.Test)

Example 2 with MockServerInfoService

use of com.twitter.distributedlog.client.proxy.MockDistributedLogServices.MockServerInfoService in project distributedlog by twitter.

the class TestProxyClientManager method createMockProxyClient.

private static Pair<MockProxyClient, MockServerInfoService> createMockProxyClient(SocketAddress address, ServerInfo serverInfo) {
    MockServerInfoService service = new MockServerInfoService();
    MockProxyClient proxyClient = new MockProxyClient(address, service);
    service.updateServerInfo(serverInfo);
    return Pair.of(proxyClient, service);
}
Also used : MockServerInfoService(com.twitter.distributedlog.client.proxy.MockDistributedLogServices.MockServerInfoService) MockProxyClient(com.twitter.distributedlog.client.proxy.MockProxyClientBuilder.MockProxyClient)

Example 3 with MockServerInfoService

use of com.twitter.distributedlog.client.proxy.MockDistributedLogServices.MockServerInfoService in project distributedlog by twitter.

the class TestProxyClientManager method testHandshake.

@Test(timeout = 60000)
public void testHandshake() throws Exception {
    final int numHosts = 3;
    final int numStreamsPerHost = 3;
    final int initialPort = 4000;
    MockProxyClientBuilder builder = new MockProxyClientBuilder();
    Map<SocketAddress, ServerInfo> serverInfoMap = new HashMap<SocketAddress, ServerInfo>();
    for (int i = 0; i < numHosts; i++) {
        SocketAddress address = createSocketAddress(initialPort + i);
        ServerInfo serverInfo = new ServerInfo();
        for (int j = 0; j < numStreamsPerHost; j++) {
            serverInfo.putToOwnerships(runtime.getMethodName() + "_stream_" + j, address.toString());
        }
        Pair<MockProxyClient, MockServerInfoService> mockProxyClient = createMockProxyClient(address, serverInfo);
        builder.provideProxyClient(address, mockProxyClient.getLeft());
        serverInfoMap.put(address, serverInfo);
    }
    final Map<SocketAddress, ServerInfo> results = new HashMap<SocketAddress, ServerInfo>();
    final CountDownLatch doneLatch = new CountDownLatch(2 * numHosts);
    ProxyListener listener = new ProxyListener() {

        @Override
        public void onHandshakeSuccess(SocketAddress address, ProxyClient client, ServerInfo serverInfo) {
            synchronized (results) {
                results.put(address, serverInfo);
            }
            doneLatch.countDown();
        }

        @Override
        public void onHandshakeFailure(SocketAddress address, ProxyClient client, Throwable cause) {
        }
    };
    TestHostProvider rs = new TestHostProvider();
    ProxyClientManager clientManager = createProxyClientManager(builder, rs, 0L);
    clientManager.registerProxyListener(listener);
    assertEquals("There should be no clients in the manager", 0, clientManager.getNumProxies());
    for (int i = 0; i < numHosts; i++) {
        rs.addHost(createSocketAddress(initialPort + i));
    }
    // handshake would handshake with 3 hosts again
    clientManager.handshake();
    doneLatch.await();
    assertEquals("Handshake should return server info", numHosts, results.size());
    assertTrue("Handshake should get all server infos", Maps.difference(serverInfoMap, results).areEqual());
}
Also used : HashMap(java.util.HashMap) ServerInfo(com.twitter.distributedlog.thrift.service.ServerInfo) MockServerInfoService(com.twitter.distributedlog.client.proxy.MockDistributedLogServices.MockServerInfoService) MockProxyClient(com.twitter.distributedlog.client.proxy.MockProxyClientBuilder.MockProxyClient) CountDownLatch(java.util.concurrent.CountDownLatch) MockProxyClient(com.twitter.distributedlog.client.proxy.MockProxyClientBuilder.MockProxyClient) SocketAddress(java.net.SocketAddress) InetSocketAddress(java.net.InetSocketAddress) Test(org.junit.Test)

Example 4 with MockServerInfoService

use of com.twitter.distributedlog.client.proxy.MockDistributedLogServices.MockServerInfoService in project distributedlog by twitter.

the class TestProxyClientManager method testCreateClientShouldHandshake.

@Test(timeout = 60000)
public void testCreateClientShouldHandshake() throws Exception {
    SocketAddress address = createSocketAddress(3000);
    MockProxyClientBuilder builder = new MockProxyClientBuilder();
    ServerInfo serverInfo = new ServerInfo();
    serverInfo.putToOwnerships(runtime.getMethodName() + "_stream", runtime.getMethodName() + "_owner");
    Pair<MockProxyClient, MockServerInfoService> mockProxyClient = createMockProxyClient(address, serverInfo);
    builder.provideProxyClient(address, mockProxyClient.getLeft());
    final AtomicReference<ServerInfo> resultHolder = new AtomicReference<ServerInfo>(null);
    final CountDownLatch doneLatch = new CountDownLatch(1);
    ProxyListener listener = new ProxyListener() {

        @Override
        public void onHandshakeSuccess(SocketAddress address, ProxyClient client, ServerInfo serverInfo) {
            resultHolder.set(serverInfo);
            doneLatch.countDown();
        }

        @Override
        public void onHandshakeFailure(SocketAddress address, ProxyClient client, Throwable cause) {
        }
    };
    ProxyClientManager clientManager = createProxyClientManager(builder, 0L);
    clientManager.registerProxyListener(listener);
    assertEquals("There should be no clients in the manager", 0, clientManager.getNumProxies());
    clientManager.createClient(address);
    assertEquals("Create client should build the proxy client", 1, clientManager.getNumProxies());
    // When a client is created, it would handshake with that proxy
    doneLatch.await();
    assertEquals("Handshake should return server info", serverInfo, resultHolder.get());
}
Also used : ServerInfo(com.twitter.distributedlog.thrift.service.ServerInfo) MockServerInfoService(com.twitter.distributedlog.client.proxy.MockDistributedLogServices.MockServerInfoService) AtomicReference(java.util.concurrent.atomic.AtomicReference) MockProxyClient(com.twitter.distributedlog.client.proxy.MockProxyClientBuilder.MockProxyClient) CountDownLatch(java.util.concurrent.CountDownLatch) MockProxyClient(com.twitter.distributedlog.client.proxy.MockProxyClientBuilder.MockProxyClient) SocketAddress(java.net.SocketAddress) InetSocketAddress(java.net.InetSocketAddress) Test(org.junit.Test)

Aggregations

MockServerInfoService (com.twitter.distributedlog.client.proxy.MockDistributedLogServices.MockServerInfoService)4 MockProxyClient (com.twitter.distributedlog.client.proxy.MockProxyClientBuilder.MockProxyClient)4 ServerInfo (com.twitter.distributedlog.thrift.service.ServerInfo)3 InetSocketAddress (java.net.InetSocketAddress)3 SocketAddress (java.net.SocketAddress)3 CountDownLatch (java.util.concurrent.CountDownLatch)3 Test (org.junit.Test)3 HashMap (java.util.HashMap)2 AtomicReference (java.util.concurrent.atomic.AtomicReference)1