diff --git a/src/main/java/com/google/devtools/build/lib/worker/BUILD b/src/main/java/com/google/devtools/build/lib/worker/BUILD index 9ff47bc5892c04..3b46785fad7139 100644 --- a/src/main/java/com/google/devtools/build/lib/worker/BUILD +++ b/src/main/java/com/google/devtools/build/lib/worker/BUILD @@ -233,6 +233,7 @@ java_library( ":worker_key", ":worker_pool", "//third_party:apache_commons_pool2", + "//third_party:flogger", "//third_party:guava", "//third_party:jsr305", ], diff --git a/src/main/java/com/google/devtools/build/lib/worker/SimpleWorkerPool.java b/src/main/java/com/google/devtools/build/lib/worker/SimpleWorkerPool.java index 6360b5d5f176e1..130274feb89cd6 100644 --- a/src/main/java/com/google/devtools/build/lib/worker/SimpleWorkerPool.java +++ b/src/main/java/com/google/devtools/build/lib/worker/SimpleWorkerPool.java @@ -15,6 +15,7 @@ import com.google.common.base.Throwables; import com.google.common.eventbus.EventBus; +import com.google.common.flogger.GoogleLogger; import java.io.IOException; import java.util.HashMap; import java.util.Map; @@ -32,6 +33,8 @@ @ThreadSafe final class SimpleWorkerPool extends GenericKeyedObjectPool { + private static final GoogleLogger logger = GoogleLogger.forEnclosingClass(); + /** * The subtrahend for maximal toal number of object per key. Unfortunately * GenericKeyedObjectPoolConfig doesn't support different number of objects per key, so we need to @@ -101,7 +104,7 @@ public void invalidateObject(WorkerKey key, Worker obj) throws InterruptedExcept if (eventBus != null) { eventBus.post(new WorkerEvictedEvent(key.hashCode(), key.getMnemonic())); } - updateShrunkBy(key); + updateShrunkBy(key, obj.getWorkerId()); } } catch (Throwable t) { Throwables.propagateIfPossible(t, InterruptedException.class); @@ -116,7 +119,7 @@ public void returnObject(WorkerKey key, Worker obj) { if (eventBus != null) { eventBus.post(new WorkerEvictedEvent(key.hashCode(), key.getMnemonic())); } - updateShrunkBy(key); + updateShrunkBy(key, obj.getWorkerId()); } } @@ -124,10 +127,13 @@ public int getMaxTotalPerKey(WorkerKey key) { return getMaxTotalPerKey() - shrunkBy.getOrDefault(key, 0); } - private synchronized void updateShrunkBy(WorkerKey workerKey) { + private synchronized void updateShrunkBy(WorkerKey workerKey, int workerId) { int currentValue = shrunkBy.getOrDefault(workerKey, 0); if (getMaxTotalPerKey() - currentValue > 1) { - shrunkBy.put(workerKey, currentValue + 1); + int newValue = currentValue + 1; + logger.atInfo().log( + "shrinking %s (worker-%d) by %d.", workerKey.getMnemonic(), workerId, newValue); + shrunkBy.put(workerKey, newValue); } } diff --git a/src/main/java/com/google/devtools/build/lib/worker/WorkerPoolImpl.java b/src/main/java/com/google/devtools/build/lib/worker/WorkerPoolImpl.java index 63da7d2ba7a894..6de7cae6c2b0c0 100644 --- a/src/main/java/com/google/devtools/build/lib/worker/WorkerPoolImpl.java +++ b/src/main/java/com/google/devtools/build/lib/worker/WorkerPoolImpl.java @@ -18,6 +18,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.eventbus.EventBus; +import com.google.common.flogger.GoogleLogger; import java.io.IOException; import java.util.LinkedHashMap; import java.util.List; @@ -32,14 +33,20 @@ /** Implementation of WorkerPool. */ @ThreadSafe public class WorkerPoolImpl implements WorkerPool { + + private static final GoogleLogger logger = GoogleLogger.forEnclosingClass(); + /** Unless otherwise specified, the max number of workers per WorkerKey. */ private static final int DEFAULT_MAX_WORKERS = 4; + /** Unless otherwise specified, the max number of multiplex workers per WorkerKey. */ private static final int DEFAULT_MAX_MULTIPLEX_WORKERS = 8; private final WorkerPoolConfig workerPoolConfig; + /** Map of singleplex worker pools, one per mnemonic. */ private final ImmutableMap workerPools; + /** Map of multiplex worker pools, one per mnemonic. */ private final ImmutableMap multiplexPools; @@ -130,10 +137,10 @@ public void evictWithPolicy(EvictionPolicy evictionPolicy) throws Interr private void evictWithPolicy(EvictionPolicy evictionPolicy, SimpleWorkerPool pool) throws InterruptedException { try { - pool.setEvictionPolicy(evictionPolicy); - pool.evict(); - } catch (Throwable t) { - Throwables.propagateIfPossible(t, InterruptedException.class); + pool.setEvictionPolicy(evictionPolicy); + pool.evict(); + } catch (Throwable t) { + Throwables.propagateIfPossible(t, InterruptedException.class); throw new VerifyException("unexpected", t); } } @@ -186,11 +193,17 @@ public synchronized void setDoomedWorkers(ImmutableSet workerIds) { @Override public synchronized void clearDoomedWorkers() { this.doomedWorkers = ImmutableSet.of(); - for (SimpleWorkerPool pool : workerPools.values()) { - pool.clearShrunkBy(); + for (Entry entry : workerPools.entrySet()) { + logger.atInfo().log( + "clearing shrunk by values for %s worker pool", + entry.getKey().isEmpty() ? "shared" : entry.getKey()); + entry.getValue().clearShrunkBy(); } - for (SimpleWorkerPool pool : multiplexPools.values()) { - pool.clearShrunkBy(); + for (Entry entry : multiplexPools.entrySet()) { + logger.atInfo().log( + "clearing shrunk by values for %s multiplex worker pool", + entry.getKey().isEmpty() ? "shared" : entry.getKey()); + entry.getValue().clearShrunkBy(); } }