use of io.netty.util.HashedWheelTimer in project pinot by linkedin.
the class NettySingleConnectionIntegrationTest method testValidatePool.
/*
* WARNING: This test has potential failures due to timing.
*/
@Test
public void testValidatePool() throws Exception {
NettyClientMetrics metric = new NettyClientMetrics(null, "abc");
Timer timer = new HashedWheelTimer();
MyServer server = new MyServer();
Thread.sleep(1000);
// used as a key to pool. Can be anything.
final String serverName = "SomeServer";
ServerInstance serverInstance = server.getServerInstance();
MetricsRegistry metricsRegistry = new MetricsRegistry();
EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
PooledNettyClientResourceManager resourceManager = new PooledNettyClientResourceManager(eventLoopGroup, new HashedWheelTimer(), metric);
ExecutorService executorService = Executors.newCachedThreadPool();
ScheduledExecutorService timeoutExecutor = new ScheduledThreadPoolExecutor(5);
AsyncPoolResourceManagerAdapter<ServerInstance, NettyClientConnection> rmAdapter = new AsyncPoolResourceManagerAdapter<ServerInstance, NettyClientConnection>(serverInstance, resourceManager, executorService, metricsRegistry);
AsyncPool pool = new AsyncPoolImpl<NettyClientConnection>(serverName, rmAdapter, /*maxSize=*/
5, /*idleTimeoutMs=*/
100000, timeoutExecutor, executorService, /*maxWaiters=*/
10, AsyncPoolImpl.Strategy.LRU, /*minSize=*/
2, metricsRegistry);
pool.start();
Callback<NoneType> callback;
callback = new Callback<NoneType>() {
@Override
public void onSuccess(NoneType arg0) {
}
@Override
public void onError(Throwable arg0) {
Assert.fail("Shutdown error");
}
};
boolean serverShutdown = false;
try {
PoolStats stats;
/* Validate with no connection in pool */
// Give the pool enough time to create connections (in this case, 2 connections minSize)
Thread.sleep(3000);
// System.out.println("Validating with no used objects in the pool");
pool.validate(false);
// System.out.println(stats);
stats = pool.getStats();
Assert.assertEquals(2, stats.getPoolSize());
Assert.assertEquals(0, stats.getTotalBadDestroyed());
/* checkout one connection, it should not destroy anything */
AsyncResponseFuture<ServerInstance, NettyClientConnection> future = new AsyncResponseFuture<ServerInstance, NettyClientConnection>(serverInstance, "Future for " + serverName);
Cancellable cancellable = pool.get(future);
future.setCancellable(cancellable);
NettyClientConnection conn = future.getOne();
// System.out.println(stats);
stats = pool.getStats();
// System.out.println("Validating with one used object in the pool");
pool.validate(false);
Assert.assertEquals(2, stats.getPoolSize());
Assert.assertEquals(0, stats.getTotalBadDestroyed());
Assert.assertEquals(1, stats.getCheckedOut());
// Now stop the server, so that the checked out connection is invalidated.
server.shutdown();
serverShutdown = true;
;
// Wait for the client channel to be closed.
Thread.sleep(2000);
pool.validate(false);
// Wait for the callback into AsyncPoolImpl after the destroy thread completes destroying the connection
Thread.sleep(5000);
// System.out.println("Validating with one used object in the pool, after server shutdown");
// System.out.println(stats);
stats = pool.getStats();
Assert.assertEquals(2, stats.getPoolSize());
Assert.assertEquals(1, stats.getTotalBadDestroyed());
Assert.assertEquals(1, stats.getCheckedOut());
} finally {
server.shutdown();
pool.shutdown(callback);
executorService.shutdown();
timeoutExecutor.shutdown();
}
}
use of io.netty.util.HashedWheelTimer in project pinot by linkedin.
the class NettySingleConnectionIntegrationTest method testSingleSmallRequestResponse.
@Test
public /**
* Test Single small request response
* @throws Exception
*/
void testSingleSmallRequestResponse() throws Exception {
NettyClientMetrics metric = new NettyClientMetrics(null, "abc");
Timer timer = new HashedWheelTimer();
MyServer server = new MyServer();
Thread.sleep(1000);
EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
NettyTCPClientConnection clientConn = new NettyTCPClientConnection(server.getServerInstance(), eventLoopGroup, timer, metric);
try {
LOGGER.info("About to connect the client !!");
boolean connected = clientConn.connect();
LOGGER.info("Client connected !!");
Assert.assertTrue(connected, "connected");
Thread.sleep(1000);
String request = "dummy request";
LOGGER.info("Sending the request !!");
ResponseFuture serverRespFuture = clientConn.sendRequest(Unpooled.wrappedBuffer(request.getBytes()), 1L, 5000L);
LOGGER.info("Request sent !!");
ByteBuf serverResp = serverRespFuture.getOne();
byte[] b2 = new byte[serverResp.readableBytes()];
serverResp.readBytes(b2);
String gotResponse = new String(b2);
Assert.assertEquals(gotResponse, server.getResponseStr(), "Response Check at client");
Assert.assertEquals(server.getHandler().getRequest(), request, "Request Check at server");
// System.out.println(metric);
} finally {
if (null != clientConn) {
clientConn.close();
}
server.shutdown();
}
}
use of io.netty.util.HashedWheelTimer in project pinot by linkedin.
the class NettySingleConnectionIntegrationTest method test10KSmallRequestResponses.
@Test
public /**
* Send 10K small sized request in sequence. Verify each request and response.
* @throws Exception
*/
void test10KSmallRequestResponses() throws Exception {
NettyClientMetrics metric = new NettyClientMetrics(null, "abc");
MyServer server = new MyServer(null);
Thread.sleep(1000);
EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
NettyTCPClientConnection clientConn = new NettyTCPClientConnection(server.getServerInstance(), eventLoopGroup, new HashedWheelTimer(), metric);
try {
LOGGER.info("About to connect the client !!");
boolean connected = clientConn.connect();
LOGGER.info("Client connected !!");
Assert.assertTrue(connected, "connected");
Thread.sleep(1000);
for (int i = 0; i < 10000; i++) {
String request = "dummy request :" + i;
String response = "dummy response :" + i;
server.getHandler().setResponse(response);
LOGGER.info("Sending the request (" + request + ")");
ResponseFuture serverRespFuture = clientConn.sendRequest(Unpooled.wrappedBuffer(request.getBytes()), 1L, 5000L);
LOGGER.info("Request sent !!");
ByteBuf serverResp = serverRespFuture.getOne();
if (null == serverResp) {
LOGGER.error("Got unexpected error while trying to get response.", serverRespFuture.getError());
}
byte[] b2 = new byte[serverResp.readableBytes()];
serverResp.readBytes(b2);
String gotResponse = new String(b2);
Assert.assertEquals(gotResponse, response, "Response Check at client");
Assert.assertEquals(server.getHandler().getRequest(), request, "Request Check at server");
}
} finally {
if (null != clientConn) {
clientConn.close();
}
server.shutdown();
}
}
use of io.netty.util.HashedWheelTimer in project pinot by linkedin.
the class NettySingleConnectionIntegrationTest method testCancelOutstandingRequest.
@Test
public void testCancelOutstandingRequest() throws Exception {
NettyClientMetrics metric = new NettyClientMetrics(null, "abc");
CountDownLatch latch = new CountDownLatch(1);
MyServer server = new MyServer();
Thread.sleep(1000);
EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
NettyTCPClientConnection clientConn = new NettyTCPClientConnection(server.getServerInstance(), eventLoopGroup, new HashedWheelTimer(), metric);
LOGGER.info("About to connect the client !!");
boolean connected = clientConn.connect();
LOGGER.info("Client connected !!");
Assert.assertTrue(connected, "connected");
Thread.sleep(1000);
String request = "dummy request";
LOGGER.info("Sending the request !!");
ResponseFuture serverRespFuture = clientConn.sendRequest(Unpooled.wrappedBuffer(request.getBytes()), 1L, 5000L);
serverRespFuture.cancel(false);
latch.countDown();
ByteBuf serverResp = serverRespFuture.getOne();
Assert.assertNull(serverResp);
Assert.assertTrue(serverRespFuture.isCancelled(), "Is Cancelled");
clientConn.close();
server.shutdown();
}
use of io.netty.util.HashedWheelTimer in project pinot by linkedin.
the class ScatterGatherPerfClient method setup.
private void setup() {
MetricsRegistry registry = new MetricsRegistry();
_timedExecutor = new ScheduledThreadPoolExecutor(1);
_service = new ThreadPoolExecutor(10, 10, 10, TimeUnit.DAYS, new LinkedBlockingDeque<Runnable>());
_eventLoopGroup = new NioEventLoopGroup(10);
_timer = new HashedWheelTimer();
NettyClientMetrics clientMetrics = new NettyClientMetrics(registry, "client_");
PooledNettyClientResourceManager rm = new PooledNettyClientResourceManager(_eventLoopGroup, _timer, clientMetrics);
_pool = new KeyedPoolImpl<ServerInstance, NettyClientConnection>(1, _maxActiveConnections, 300000, 10, rm, _timedExecutor, MoreExecutors.sameThreadExecutor(), registry);
rm.setPool(_pool);
_scatterGather = new ScatterGatherImpl(_pool, _service);
for (AsyncReader r : _readerThreads) {
r.start();
}
}
Aggregations