Implement missing WorkerKeyPool.close() that kills workers when shutting down the pool.
PiperOrigin-RevId: 626352634
Change-Id: I3f8a816b4f21619fe1e159a228e374ef1765a8a0
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 e79ef12..a08ef53 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
@@ -357,7 +357,18 @@
key.getMnemonic(), key.hashCode());
}
- private void close() {}
+ // Destroys all workers created in this pool.
+ private synchronized void close() {
+ for (Worker worker : idleQueue) {
+ factory.destroyWorker(worker.getWorkerKey(), worker);
+ }
+ for (Worker worker : activeSet) {
+ logger.atInfo().log(
+ "Interrupting and shutting down active worker %s (id %d) due to pool shutdown",
+ key.getMnemonic(), worker.getWorkerId());
+ factory.destroyWorker(worker.getWorkerKey(), worker);
+ }
+ }
}
/**
diff --git a/src/test/java/com/google/devtools/build/lib/worker/WorkerPoolTest.java b/src/test/java/com/google/devtools/build/lib/worker/WorkerPoolTest.java
index 73940af..3ac4e63 100644
--- a/src/test/java/com/google/devtools/build/lib/worker/WorkerPoolTest.java
+++ b/src/test/java/com/google/devtools/build/lib/worker/WorkerPoolTest.java
@@ -401,4 +401,16 @@
workerPool.reset();
assertThat(workerPool.getMaxTotalPerKey(workerKey)).isEqualTo(2);
}
+
+ @Test
+ public void testClose_destroysWorkers() throws Exception {
+ WorkerKey workerKey = createWorkerKey(fileSystem, "mnem", false);
+ Worker worker1 = workerPool.borrowObject(workerKey);
+ Worker worker2 = workerPool.borrowObject(workerKey);
+ workerPool.returnObject(workerKey, worker1);
+ workerPool.returnObject(workerKey, worker2);
+ workerPool.close();
+ verify(factoryMock).destroyWorker(workerKey, worker1);
+ verify(factoryMock).destroyWorker(workerKey, worker2);
+ }
}