aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/sandbox/AbstractSandboxSpawnRunner.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/sandbox/AbstractSandboxSpawnRunner.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/sandbox/AbstractSandboxSpawnRunner.java23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/AbstractSandboxSpawnRunner.java b/src/main/java/com/google/devtools/build/lib/sandbox/AbstractSandboxSpawnRunner.java
index 9fee6544dd..33b21209da 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/AbstractSandboxSpawnRunner.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/AbstractSandboxSpawnRunner.java
@@ -50,11 +50,13 @@ abstract class AbstractSandboxSpawnRunner implements SpawnRunner {
private static final String SANDBOX_DEBUG_SUGGESTION =
"\n\nUse --sandbox_debug to see verbose messages from the sandbox";
+ private final Path sandboxBase;
private final SandboxOptions sandboxOptions;
private final boolean verboseFailures;
private final ImmutableSet<Path> inaccessiblePaths;
- public AbstractSandboxSpawnRunner(CommandEnvironment cmdEnv) {
+ public AbstractSandboxSpawnRunner(CommandEnvironment cmdEnv, Path sandboxBase) {
+ this.sandboxBase = sandboxBase;
this.sandboxOptions = cmdEnv.getOptions().getOptions(SandboxOptions.class);
this.verboseFailures = cmdEnv.getOptions().getOptions(ExecutionOptions.class).verboseFailures;
this.inaccessiblePaths =
@@ -86,6 +88,7 @@ abstract class AbstractSandboxSpawnRunner implements SpawnRunner {
SandboxedSpawn sandbox,
SpawnExecutionPolicy policy,
Path execRoot,
+ Path tmpDir,
Duration timeout,
Path statisticsPath)
throws IOException, InterruptedException {
@@ -94,7 +97,8 @@ abstract class AbstractSandboxSpawnRunner implements SpawnRunner {
OutErr outErr = policy.getFileOutErr();
policy.prefetchInputs();
- SpawnResult result = run(originalSpawn, sandbox, outErr, timeout, execRoot, statisticsPath);
+ SpawnResult result =
+ run(originalSpawn, sandbox, outErr, timeout, execRoot, tmpDir, statisticsPath);
policy.lockOutputFiles();
try {
@@ -117,6 +121,7 @@ abstract class AbstractSandboxSpawnRunner implements SpawnRunner {
OutErr outErr,
Duration timeout,
Path execRoot,
+ Path tmpDir,
Path statisticsPath)
throws IOException, InterruptedException {
Command cmd = new Command(
@@ -140,6 +145,9 @@ abstract class AbstractSandboxSpawnRunner implements SpawnRunner {
long startTime = System.currentTimeMillis();
CommandResult commandResult;
try {
+ if (!tmpDir.exists() && !tmpDir.createDirectory()) {
+ throw new IOException(String.format("Could not create temp directory '%s'", tmpDir));
+ }
commandResult = cmd.execute(outErr.getOutputStream(), outErr.getErrorStream());
if (Thread.currentThread().isInterrupted()) {
throw new InterruptedException();
@@ -206,6 +214,17 @@ abstract class AbstractSandboxSpawnRunner implements SpawnRunner {
}
/**
+ * Returns a temporary directory that should be used as the sandbox directory for a single action.
+ */
+ protected Path getSandboxRoot() throws IOException {
+ return sandboxBase.getRelative(
+ java.nio.file.Files.createTempDirectory(
+ java.nio.file.Paths.get(sandboxBase.getPathString()), "")
+ .getFileName()
+ .toString());
+ }
+
+ /**
* Gets the list of directories that the spawn will assume to be writable.
*
* @throws IOException because we might resolve symlinks, which throws {@link IOException}.