Assign unique work directory for worker for each test case
Closes #17542.
PiperOrigin-RevId: 511166369
Change-Id: I9f747b8081dbae6d5df25e22a47f3d0a3b777af5
diff --git a/src/test/java/com/google/devtools/build/lib/remote/util/IntegrationTestUtils.java b/src/test/java/com/google/devtools/build/lib/remote/util/IntegrationTestUtils.java
index ded66dd..5c05143 100644
--- a/src/test/java/com/google/devtools/build/lib/remote/util/IntegrationTestUtils.java
+++ b/src/test/java/com/google/devtools/build/lib/remote/util/IntegrationTestUtils.java
@@ -35,6 +35,7 @@
import java.nio.file.Paths;
import java.util.Comparator;
import java.util.Random;
+import java.util.concurrent.atomic.AtomicInteger;
import javax.annotation.Nullable;
/** Integration test utilities. */
@@ -46,6 +47,8 @@
"io_bazel/src/tools/remote/worker"
+ (OS.getCurrent() == OS.WINDOWS ? ".exe" : ""));
+ private static final AtomicInteger WORKER_COUNTER = new AtomicInteger(0);
+
private static boolean isPortAvailable(int port) {
if (port < 1024 || port > 65535) {
return false;
@@ -115,7 +118,7 @@
PathFragment workPath = testTmpDir.getRelative("remote.work_path");
PathFragment casPath = testTmpDir.getRelative("remote.cas_path");
int workerPort = pickUnusedRandomPort();
- var worker = new WorkerInstance(useHttp, workerPort, workPath, casPath);
+ var worker = new WorkerInstance(WORKER_COUNTER, useHttp, workerPort, workPath, casPath);
worker.start();
return worker;
}
@@ -125,27 +128,44 @@
if (dir.exists()) {
throw new IOException(path + " already exists");
}
- if (!dir.mkdir()) {
+ if (!dir.mkdirs()) {
throw new IOException("Failed to create directory " + path);
}
}
public static class WorkerInstance {
- @Nullable private Subprocess process;
+ private final AtomicInteger counter;
private final boolean useHttp;
private final int port;
- private final PathFragment workPath;
- private final PathFragment casPath;
+ private final PathFragment workPathPrefix;
+ private final PathFragment casPathPrefix;
- private WorkerInstance(boolean useHttp, int port, PathFragment workPath, PathFragment casPath) {
+ @Nullable private Subprocess process;
+ @Nullable PathFragment workPath;
+ @Nullable PathFragment casPath;
+
+ private WorkerInstance(
+ AtomicInteger counter,
+ boolean useHttp,
+ int port,
+ PathFragment workPathPrefix,
+ PathFragment casPathPrefix) {
+ this.counter = counter;
this.useHttp = useHttp;
this.port = port;
- this.workPath = workPath;
- this.casPath = casPath;
+ this.workPathPrefix = workPathPrefix;
+ this.casPathPrefix = casPathPrefix;
}
private void start() throws IOException, InterruptedException {
Preconditions.checkState(process == null);
+ Preconditions.checkState(workPath == null);
+ Preconditions.checkState(casPath == null);
+
+ var suffix = String.valueOf(counter.getAndIncrement());
+ workPath = workPathPrefix.getRelative(suffix);
+ casPath = casPathPrefix.getRelative(suffix);
+
ensureMkdir(workPath);
ensureMkdir(casPath);
String workerPath = Runfiles.create().rlocation(WORKER_PATH.getSafePathString());
@@ -167,7 +187,10 @@
process = null;
deleteDir(workPath);
+ workPath = null;
+
deleteDir(casPath);
+ casPath = null;
}
public void restart() throws IOException, InterruptedException {
@@ -184,13 +207,5 @@
public int getPort() {
return port;
}
-
- public PathFragment getWorkPath() {
- return workPath;
- }
-
- public PathFragment getCasPath() {
- return casPath;
- }
}
}