public TBoundedThreadPoolServer(Args options, ThriftMetrics metrics) { super(options); int minWorkerThreads = options.minWorkerThreads; int maxWorkerThreads = options.maxWorkerThreads; if (options.maxQueuedRequests > 0) { this.callQueue = new CallQueue( new LinkedBlockingQueue<>(options.maxQueuedRequests), metrics); minWorkerThreads = maxWorkerThreads; } else { this.callQueue = new CallQueue(new SynchronousQueue<>(), metrics); } ThreadFactoryBuilder tfb = new ThreadFactoryBuilder(); tfb.setDaemon(true); tfb.setNameFormat("thrift-worker-%d"); executorService = new THBaseThreadPoolExecutor(minWorkerThreads, maxWorkerThreads, options.threadKeepAliveTimeSec, TimeUnit.SECONDS, this.callQueue, tfb.build(), metrics); executorService.allowCoreThreadTimeOut(true); serverOptions = options; }
@Override public int drainTo(Collection<? super Runnable> destination) { return drainTo(destination, Integer.MAX_VALUE); }
private void updateMetrics(Call result) { if (result == null) { return; } metrics.incTimeInQueue(result.timeInQueue()); metrics.setCallQueueLen(this.size()); }
@Test public void testOfferPoll() throws Exception { ThriftMetrics metrics = createMetrics(); CallQueue callQueue = new CallQueue(new LinkedBlockingQueue<>(), metrics); for (int i = 0; i < elementsAdded; ++i) { callQueue.offer(createDummyRunnable()); } for (int i = 0; i < elementsRemoved; ++i) { callQueue.poll(); } verifyMetrics(metrics, "timeInQueue_num_ops", elementsRemoved); }
@Test public void testPutTake() throws Exception { ThriftMetrics metrics = createMetrics(); CallQueue callQueue = new CallQueue(new LinkedBlockingQueue<>(), metrics); for (int i = 0; i < elementsAdded; ++i) { callQueue.put(createDummyRunnable()); } for (int i = 0; i < elementsRemoved; ++i) { callQueue.take(); } verifyMetrics(metrics, "timeInQueue_num_ops", elementsRemoved); }
@Override public Runnable poll() { Call result = underlyingQueue.poll(); updateMetrics(result); return result; }
@Test public void testOfferPoll() throws Exception { ThriftMetrics metrics = createMetrics(); CallQueue callQueue = new CallQueue(new LinkedBlockingQueue<>(), metrics); for (int i = 0; i < elementsAdded; ++i) { callQueue.offer(createDummyRunnable()); } for (int i = 0; i < elementsRemoved; ++i) { callQueue.poll(); } verifyMetrics(metrics, "timeInQueue_num_ops", elementsRemoved); }
@Test public void testPutTake() throws Exception { ThriftMetrics metrics = createMetrics(); CallQueue callQueue = new CallQueue(new LinkedBlockingQueue<>(), metrics); for (int i = 0; i < elementsAdded; ++i) { callQueue.put(createDummyRunnable()); } for (int i = 0; i < elementsRemoved; ++i) { callQueue.take(); } verifyMetrics(metrics, "timeInQueue_num_ops", elementsRemoved); }
@Override public Runnable take() throws InterruptedException { Call result = underlyingQueue.take(); updateMetrics(result); return result; }
protected TServer getTHsHaServer(TNonblockingServerTransport serverTransport, TProtocolFactory protocolFactory, TProcessor processor, TTransportFactory transportFactory, InetSocketAddress inetSocketAddress) { LOG.info("starting HBase HsHA Thrift server on " + inetSocketAddress.toString()); THsHaServer.Args serverArgs = new THsHaServer.Args(serverTransport); int queueSize = conf.getInt(TBoundedThreadPoolServer.MAX_QUEUED_REQUESTS_CONF_KEY, TBoundedThreadPoolServer.DEFAULT_MAX_QUEUED_REQUESTS); CallQueue callQueue = new CallQueue(new LinkedBlockingQueue<>(queueSize), metrics); int workerThread = conf.getInt(TBoundedThreadPoolServer.MAX_WORKER_THREADS_CONF_KEY, serverArgs.getMaxWorkerThreads()); ExecutorService executorService = createExecutor( callQueue, workerThread, workerThread); serverArgs.executorService(executorService).processor(processor) .transportFactory(transportFactory).protocolFactory(protocolFactory); return new THsHaServer(serverArgs); }
@Test public void testOfferPoll() throws Exception { ThriftMetrics metrics = createMetrics(); CallQueue callQueue = new CallQueue(new LinkedBlockingQueue<>(), metrics); for (int i = 0; i < elementsAdded; ++i) { callQueue.offer(createDummyRunnable()); } for (int i = 0; i < elementsRemoved; ++i) { callQueue.poll(); } verifyMetrics(metrics, "timeInQueue_num_ops", elementsRemoved); }
@Test public void testPutTake() throws Exception { ThriftMetrics metrics = createMetrics(); CallQueue callQueue = new CallQueue(new LinkedBlockingQueue<>(), metrics); for (int i = 0; i < elementsAdded; ++i) { callQueue.put(createDummyRunnable()); } for (int i = 0; i < elementsRemoved; ++i) { callQueue.take(); } verifyMetrics(metrics, "timeInQueue_num_ops", elementsRemoved); }
@Override public Runnable poll(long timeout, TimeUnit unit) throws InterruptedException { Call result = underlyingQueue.poll(timeout, unit); updateMetrics(result); return result; }
private void updateMetrics(Call result) { if (result == null) { return; } metrics.incTimeInQueue(result.timeInQueue()); metrics.setCallQueueLen(this.size()); }
@Override public int drainTo(Collection<? super Runnable> destination) { return drainTo(destination, Integer.MAX_VALUE); }
protected TServer getTThreadedSelectorServer(TNonblockingServerTransport serverTransport, TProtocolFactory protocolFactory, TProcessor processor, TTransportFactory transportFactory, InetSocketAddress inetSocketAddress) { LOG.info("starting HBase ThreadedSelector Thrift server on " + inetSocketAddress.toString()); TThreadedSelectorServer.Args serverArgs = new HThreadedSelectorServerArgs(serverTransport, conf); int queueSize = conf.getInt(TBoundedThreadPoolServer.MAX_QUEUED_REQUESTS_CONF_KEY, TBoundedThreadPoolServer.DEFAULT_MAX_QUEUED_REQUESTS); CallQueue callQueue = new CallQueue(new LinkedBlockingQueue<>(queueSize), metrics); int workerThreads = conf.getInt(TBoundedThreadPoolServer.MAX_WORKER_THREADS_CONF_KEY, serverArgs.getWorkerThreads()); int selectorThreads = conf.getInt(THRIFT_SELECTOR_NUM, serverArgs.getSelectorThreads()); serverArgs.selectorThreads(selectorThreads); ExecutorService executorService = createExecutor( callQueue, workerThreads, workerThreads); serverArgs.executorService(executorService).processor(processor) .transportFactory(transportFactory).protocolFactory(protocolFactory); return new TThreadedSelectorServer(serverArgs); }
@Override public Runnable remove() { Call result = underlyingQueue.remove(); updateMetrics(result); return result; }
private void updateMetrics(Call result) { if (result == null) { return; } metrics.incTimeInQueue(result.timeInQueue()); metrics.setCallQueueLen(this.size()); }
@Override public int drainTo(Collection<? super Runnable> destination) { return drainTo(destination, Integer.MAX_VALUE); }
private static ExecutorService createExecutor( int workerThreads, ThriftMetrics metrics) { CallQueue callQueue = new CallQueue( new LinkedBlockingQueue<Call>(), metrics); ThreadFactoryBuilder tfb = new ThreadFactoryBuilder(); tfb.setDaemon(true); tfb.setNameFormat("thrift2-worker-%d"); return new ThreadPoolExecutor(workerThreads, workerThreads, Long.MAX_VALUE, TimeUnit.SECONDS, callQueue, tfb.build()); }