Instrument BlockingThreadPoolExecutor.

This commit is contained in:
Jon Chambers 2020-06-12 13:37:42 -04:00 committed by Jon Chambers
parent 6f767a72a7
commit c17cc07b73
3 changed files with 18 additions and 4 deletions

View File

@ -56,7 +56,7 @@ public class PushSender implements Managed {
this.apnSender = apnSender;
this.webSocketSender = websocketSender;
this.queueSize = queueSize;
this.executor = new BlockingThreadPoolExecutor(50, queueSize);
this.executor = new BlockingThreadPoolExecutor("pushSender", 50, queueSize);
SharedMetricRegistries.getOrCreate(Constants.METRICS_NAME)
.register(name(PushSender.class, "send_queue_depth"),

View File

@ -1,22 +1,36 @@
package org.whispersystems.textsecuregcm.util;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.SharedMetricRegistries;
import com.codahale.metrics.Timer;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.Semaphore;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import static com.codahale.metrics.MetricRegistry.name;
public class BlockingThreadPoolExecutor extends ThreadPoolExecutor {
private final Semaphore semaphore;
private final Timer acquirePermitTimer;
public BlockingThreadPoolExecutor(int threads, int bound) {
public BlockingThreadPoolExecutor(String name, int threads, int bound) {
super(threads, threads, 1, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
this.semaphore = new Semaphore(bound);
final MetricRegistry metricRegistry = SharedMetricRegistries.getOrCreate(Constants.METRICS_NAME);
this.acquirePermitTimer = metricRegistry.timer(name(getClass(), name, "acquirePermit"));
metricRegistry.gauge(name(getClass(), name, "permitsAvailable"), () -> semaphore::availablePermits);
}
@Override
public void execute(Runnable task) {
semaphore.acquireUninterruptibly();
try (final Timer.Context ignored = acquirePermitTimer.time()) {
semaphore.acquireUninterruptibly();
}
try {
super.execute(task);

View File

@ -10,7 +10,7 @@ public class BlockingThreadPoolExecutorTest {
@Test
public void testBlocking() {
BlockingThreadPoolExecutor executor = new BlockingThreadPoolExecutor(1, 3);
BlockingThreadPoolExecutor executor = new BlockingThreadPoolExecutor("test", 1, 3);
long start = System.currentTimeMillis();
executor.execute(new Runnable() {