diff options
author | 2018-04-19 05:41:44 -0700 | |
---|---|---|
committer | 2018-04-19 05:42:58 -0700 | |
commit | 29e306d66cc4c441f0321a62101077647a4c95dc (patch) | |
tree | cabcf23c53c9cdcfe501bc5f17531f73e81c5a30 /src/main/java/com/google/devtools/build/lib/sandbox | |
parent | 9566f677a1093e3a3c0ddaed3f9ab34dd98e5e26 (diff) |
Rename SpawnExecutionPolicy -> SpawnExecutionContext.
This class will be used to tie a Spawn to a SpawnRunner, and isn't really a policy object. It will carry state such as the expanded inputs and expanded command line.
Currently a context can be passed between different SpawnRunners. This will be addressed independently, so a context is tied to a particular spawn runner.
PiperOrigin-RevId: 193501918
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/sandbox')
6 files changed, 31 insertions, 34 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..5610242eaa 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 @@ -62,14 +62,14 @@ abstract class AbstractSandboxSpawnRunner implements SpawnRunner { } @Override - public SpawnResult exec(Spawn spawn, SpawnExecutionPolicy policy) + public SpawnResult exec(Spawn spawn, SpawnExecutionContext context) throws ExecException, InterruptedException { ActionExecutionMetadata owner = spawn.getResourceOwner(); - policy.report(ProgressStatus.SCHEDULING, getName()); + context.report(ProgressStatus.SCHEDULING, getName()); try (ResourceHandle ignored = ResourceManager.instance().acquireResources(owner, spawn.getLocalResources())) { - policy.report(ProgressStatus.EXECUTING, getName()); - return actuallyExec(spawn, policy); + context.report(ProgressStatus.EXECUTING, getName()); + return actuallyExec(spawn, context); } catch (IOException e) { throw new UserExecException("I/O exception during sandboxed execution", e); } @@ -78,25 +78,25 @@ abstract class AbstractSandboxSpawnRunner implements SpawnRunner { // TODO(laszlocsomor): refactor this class to make `actuallyExec`'s contract clearer: the caller // of `actuallyExec` should not depend on `actuallyExec` calling `runSpawn` because it's easy to // forget to do so in `actuallyExec`'s implementations. - protected abstract SpawnResult actuallyExec(Spawn spawn, SpawnExecutionPolicy policy) + protected abstract SpawnResult actuallyExec(Spawn spawn, SpawnExecutionContext context) throws ExecException, InterruptedException, IOException; protected SpawnResult runSpawn( Spawn originalSpawn, SandboxedSpawn sandbox, - SpawnExecutionPolicy policy, + SpawnExecutionContext context, Path execRoot, Duration timeout, Path statisticsPath) throws IOException, InterruptedException { try { sandbox.createFileSystem(); - OutErr outErr = policy.getFileOutErr(); - policy.prefetchInputs(); + OutErr outErr = context.getFileOutErr(); + context.prefetchInputs(); SpawnResult result = run(originalSpawn, sandbox, outErr, timeout, execRoot, statisticsPath); - policy.lockOutputFiles(); + context.lockOutputFiles(); try { // We copy the outputs even when the command failed. sandbox.copyOutputs(execRoot); diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedSpawnRunner.java b/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedSpawnRunner.java index d20eec70b1..86631443bf 100644 --- a/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedSpawnRunner.java +++ b/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedSpawnRunner.java @@ -193,10 +193,10 @@ final class DarwinSandboxedSpawnRunner extends AbstractSandboxSpawnRunner { } @Override - protected SpawnResult actuallyExec(Spawn spawn, SpawnExecutionPolicy policy) + protected SpawnResult actuallyExec(Spawn spawn, SpawnExecutionContext context) throws IOException, InterruptedException { // Each invocation of "exec" gets its own sandbox. - Path sandboxPath = sandboxBase.getRelative(Integer.toString(policy.getId())); + Path sandboxPath = sandboxBase.getRelative(Integer.toString(context.getId())); sandboxPath.createDirectory(); // b/64689608: The execroot of the sandboxed process must end with the workspace name, just like @@ -215,7 +215,7 @@ final class DarwinSandboxedSpawnRunner extends AbstractSandboxSpawnRunner { ImmutableSet<PathFragment> outputs = SandboxHelpers.getOutputFiles(spawn); final Path sandboxConfigPath = sandboxPath.getRelative("sandbox.sb"); - Duration timeout = policy.getTimeout(); + Duration timeout = context.getTimeout(); ProcessWrapperUtil.CommandLineBuilder processWrapperCommandLineBuilder = ProcessWrapperUtil.commandLineBuilder(processWrapper.getPathString(), spawn.getArguments()) @@ -241,7 +241,7 @@ final class DarwinSandboxedSpawnRunner extends AbstractSandboxSpawnRunner { boolean allowNetworkForThisSpawn = allowNetwork || Spawns.requiresNetwork(spawn); - Map<PathFragment, Path> inputs = SandboxHelpers.getInputFiles(spawn, policy, execRoot); + Map<PathFragment, Path> inputs = SandboxHelpers.getInputFiles(spawn, context, execRoot); SandboxedSpawn sandbox; if (sandboxfsProcess != null) { @@ -287,7 +287,7 @@ final class DarwinSandboxedSpawnRunner extends AbstractSandboxSpawnRunner { } }; } - return runSpawn(spawn, sandbox, policy, execRoot, timeout, statisticsPath); + return runSpawn(spawn, sandbox, context, execRoot, timeout, statisticsPath); } private void writeConfig( diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedSpawnRunner.java b/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedSpawnRunner.java index f2aedf8615..888f9abab2 100644 --- a/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedSpawnRunner.java +++ b/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedSpawnRunner.java @@ -117,10 +117,10 @@ final class LinuxSandboxedSpawnRunner extends AbstractSandboxSpawnRunner { } @Override - protected SpawnResult actuallyExec(Spawn spawn, SpawnExecutionPolicy policy) + protected SpawnResult actuallyExec(Spawn spawn, SpawnExecutionContext context) throws IOException, ExecException, InterruptedException { // Each invocation of "exec" gets its own sandbox base, execroot and temporary directory. - Path sandboxPath = sandboxBase.getRelative(Integer.toString(policy.getId())); + Path sandboxPath = sandboxBase.getRelative(Integer.toString(context.getId())); sandboxPath.createDirectory(); // b/64689608: The execroot of the sandboxed process must end with the workspace name, just like @@ -134,7 +134,7 @@ final class LinuxSandboxedSpawnRunner extends AbstractSandboxSpawnRunner { ImmutableSet<Path> writableDirs = getWritableDirs(sandboxExecRoot, environment); ImmutableSet<PathFragment> outputs = SandboxHelpers.getOutputFiles(spawn); - Duration timeout = policy.getTimeout(); + Duration timeout = context.getTimeout(); LinuxSandboxUtil.CommandLineBuilder commandLineBuilder = LinuxSandboxUtil.commandLineBuilder(linuxSandbox, spawn.getArguments()) @@ -170,7 +170,7 @@ final class LinuxSandboxedSpawnRunner extends AbstractSandboxSpawnRunner { sandboxPath, commandLineBuilder.build(), environment, - SandboxHelpers.getInputFiles(spawn, policy, execRoot), + SandboxHelpers.getInputFiles(spawn, context, execRoot), outputs, ImmutableSet.of()); } else { @@ -180,12 +180,12 @@ final class LinuxSandboxedSpawnRunner extends AbstractSandboxSpawnRunner { sandboxExecRoot, commandLineBuilder.build(), environment, - SandboxHelpers.getInputFiles(spawn, policy, execRoot), + SandboxHelpers.getInputFiles(spawn, context, execRoot), outputs, writableDirs); } - return runSpawn(spawn, sandbox, policy, execRoot, timeout, statisticsPath); + return runSpawn(spawn, sandbox, context, execRoot, timeout, statisticsPath); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/ProcessWrapperSandboxedSpawnRunner.java b/src/main/java/com/google/devtools/build/lib/sandbox/ProcessWrapperSandboxedSpawnRunner.java index e79b2abcd7..b3865a73a5 100644 --- a/src/main/java/com/google/devtools/build/lib/sandbox/ProcessWrapperSandboxedSpawnRunner.java +++ b/src/main/java/com/google/devtools/build/lib/sandbox/ProcessWrapperSandboxedSpawnRunner.java @@ -63,10 +63,10 @@ final class ProcessWrapperSandboxedSpawnRunner extends AbstractSandboxSpawnRunne } @Override - protected SpawnResult actuallyExec(Spawn spawn, SpawnExecutionPolicy policy) + protected SpawnResult actuallyExec(Spawn spawn, SpawnExecutionContext context) throws ExecException, IOException, InterruptedException { // Each invocation of "exec" gets its own sandbox. - Path sandboxPath = sandboxBase.getRelative(Integer.toString(policy.getId())); + Path sandboxPath = sandboxBase.getRelative(Integer.toString(context.getId())); sandboxPath.createDirectory(); // b/64689608: The execroot of the sandboxed process must end with the workspace name, just like @@ -78,7 +78,7 @@ final class ProcessWrapperSandboxedSpawnRunner extends AbstractSandboxSpawnRunne Map<String, String> environment = localEnvProvider.rewriteLocalEnv(spawn.getEnvironment(), execRoot, "/tmp"); - Duration timeout = policy.getTimeout(); + Duration timeout = context.getTimeout(); ProcessWrapperUtil.CommandLineBuilder commandLineBuilder = ProcessWrapperUtil.commandLineBuilder(processWrapper.getPathString(), spawn.getArguments()) .setTimeout(timeout); @@ -97,11 +97,11 @@ final class ProcessWrapperSandboxedSpawnRunner extends AbstractSandboxSpawnRunne sandboxExecRoot, commandLineBuilder.build(), environment, - SandboxHelpers.getInputFiles(spawn, policy, execRoot), + SandboxHelpers.getInputFiles(spawn, context, execRoot), SandboxHelpers.getOutputFiles(spawn), getWritableDirs(sandboxExecRoot, environment)); - return runSpawn(spawn, sandbox, policy, execRoot, timeout, statisticsPath); + return runSpawn(spawn, sandbox, context, execRoot, timeout, statisticsPath); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java index cee91cebe1..0acbe064b4 100644 --- a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java +++ b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java @@ -127,12 +127,12 @@ final class SandboxActionContextProvider extends ActionContextProvider { } @Override - public SpawnResult exec(Spawn spawn, SpawnExecutionPolicy policy) + public SpawnResult exec(Spawn spawn, SpawnExecutionContext context) throws InterruptedException, IOException, ExecException { if (!Spawns.mayBeSandboxed(spawn)) { - return fallbackSpawnRunner.exec(spawn, policy); + return fallbackSpawnRunner.exec(spawn, context); } else { - return sandboxSpawnRunner.exec(spawn, policy); + return sandboxSpawnRunner.exec(spawn, context); } } } diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxHelpers.java b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxHelpers.java index 31f2dcdfd1..5894680a1e 100644 --- a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxHelpers.java +++ b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxHelpers.java @@ -27,7 +27,7 @@ import com.google.devtools.build.lib.actions.cache.VirtualActionInput; import com.google.devtools.build.lib.actions.cache.VirtualActionInput.EmptyActionInput; import com.google.devtools.build.lib.analysis.test.TestConfiguration; import com.google.devtools.build.lib.exec.SpawnInputExpander; -import com.google.devtools.build.lib.exec.SpawnRunner.SpawnExecutionPolicy; +import com.google.devtools.build.lib.exec.SpawnRunner.SpawnExecutionContext; import com.google.devtools.build.lib.rules.fileset.FilesetActionContext; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; @@ -65,11 +65,8 @@ public final class SandboxHelpers { * host filesystem where the input files can be found. */ public static Map<PathFragment, Path> getInputFiles( - Spawn spawn, - SpawnExecutionPolicy policy, - Path execRoot) - throws IOException { - return postProcess(policy.getInputMapping(), spawn, policy.getArtifactExpander(), execRoot); + Spawn spawn, SpawnExecutionContext context, Path execRoot) throws IOException { + return postProcess(context.getInputMapping(), spawn, context.getArtifactExpander(), execRoot); } /** |