in src/main/java/build/buildfarm/worker/shard/CFCExecFileSystem.java [312:399]
public Path createExecDir(
String operationName, Map<Digest, Directory> directoriesIndex, Action action, Command command)
throws IOException, InterruptedException {
OutputDirectory outputDirectory =
OutputDirectory.parse(
command.getOutputFilesList(),
command.getOutputDirectoriesList(),
command.getEnvironmentVariablesList());
Path execDir = root.resolve(operationName);
if (Files.exists(execDir)) {
Directories.remove(execDir);
}
Files.createDirectories(execDir);
ImmutableList.Builder<String> inputFiles = new ImmutableList.Builder<>();
ImmutableList.Builder<Digest> inputDirectories = new ImmutableList.Builder<>();
logger.log(
Level.FINE, "ExecFileSystem::createExecDir(" + operationName + ") calling fetchInputs");
Iterable<ListenableFuture<Void>> fetchedFutures =
fetchInputs(
execDir,
action.getInputRootDigest(),
directoriesIndex,
outputDirectory,
inputFiles,
inputDirectories);
boolean success = false;
try {
InterruptedException exception = null;
boolean wasInterrupted = false;
ImmutableList.Builder<Throwable> exceptions = ImmutableList.builder();
for (ListenableFuture<Void> fetchedFuture : fetchedFutures) {
if (exception != null || wasInterrupted) {
fetchedFuture.cancel(true);
} else {
try {
fetchedFuture.get();
} catch (ExecutionException e) {
// just to ensure that no other code can react to interrupt status
exceptions.add(e.getCause());
} catch (InterruptedException e) {
fetchedFuture.cancel(true);
exception = e;
}
}
wasInterrupted = Thread.interrupted() || wasInterrupted;
}
if (wasInterrupted) {
Thread.currentThread().interrupt();
// unlikely, but worth guarding
if (exception == null) {
exception = new InterruptedException();
}
}
if (exception != null) {
throw exception;
}
checkExecErrors(execDir, exceptions.build());
success = true;
} finally {
if (!success) {
fileCache.decrementReferences(inputFiles.build(), inputDirectories.build());
Directories.remove(execDir);
}
}
rootInputFiles.put(execDir, inputFiles.build());
rootInputDirectories.put(execDir, inputDirectories.build());
logger.log(
Level.FINE,
"ExecFileSystem::createExecDir(" + operationName + ") stamping output directories");
boolean stamped = false;
try {
outputDirectory.stamp(execDir);
stamped = true;
} finally {
if (!stamped) {
destroyExecDir(execDir);
}
}
if (owner != null) {
Directories.setAllOwner(execDir, owner);
}
return execDir;
}