diff options
author | ulfjack <ulfjack@google.com> | 2017-07-24 11:09:40 +0200 |
---|---|---|
committer | Jakob Buchgraber <buchgr@google.com> | 2017-07-24 13:18:53 +0200 |
commit | 19befaf4c8623bf9671e0d8d5f4e713cd8a2c7a1 (patch) | |
tree | c49cad1df02499e9809ec739be6efcde693131be /src/main/java/com/google/devtools/build/lib/standalone | |
parent | 4dfb271df9dcdf01413a216ad046d955669160b7 (diff) |
Extract a common AbstractSpawnStrategy parent class
This removes a bunch of code duplication that I previously introduced.
PiperOrigin-RevId: 162909430
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/standalone')
2 files changed, 26 insertions, 146 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java index ba42ed9965..62b1a7ee3e 100644 --- a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java +++ b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java @@ -24,14 +24,19 @@ import com.google.devtools.build.lib.actions.ResourceManager; import com.google.devtools.build.lib.exec.ActionContextProvider; import com.google.devtools.build.lib.exec.ExecutionOptions; import com.google.devtools.build.lib.exec.FileWriteStrategy; +import com.google.devtools.build.lib.exec.SpawnRunner; import com.google.devtools.build.lib.exec.StandaloneTestStrategy; import com.google.devtools.build.lib.exec.TestStrategy; +import com.google.devtools.build.lib.exec.apple.XCodeLocalEnvProvider; +import com.google.devtools.build.lib.exec.local.LocalEnvProvider; import com.google.devtools.build.lib.exec.local.LocalExecutionOptions; +import com.google.devtools.build.lib.exec.local.LocalSpawnRunner; import com.google.devtools.build.lib.rules.cpp.IncludeScanningContext; import com.google.devtools.build.lib.rules.cpp.SpawnGccStrategy; import com.google.devtools.build.lib.rules.test.ExclusiveTestStrategy; import com.google.devtools.build.lib.rules.test.TestActionContext; import com.google.devtools.build.lib.runtime.CommandEnvironment; +import com.google.devtools.build.lib.util.OS; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.Path; import java.io.IOException; @@ -72,8 +77,6 @@ public class StandaloneActionContextProvider extends ActionContextProvider { @Override public Iterable<? extends ActionContext> getActionContexts() { ExecutionOptions executionOptions = env.getOptions().getOptions(ExecutionOptions.class); - LocalExecutionOptions localExecutionOptions = - env.getOptions().getOptions(LocalExecutionOptions.class); Path testTmpRoot = TestStrategy.getTmpRoot(env.getWorkspace(), env.getExecRoot(), executionOptions); @@ -86,16 +89,26 @@ public class StandaloneActionContextProvider extends ActionContextProvider { // could potentially be used and a spawnActionContext doesn't specify which one it wants, the // last one from strategies list will be used return ImmutableList.of( - new StandaloneSpawnStrategy( - env.getExecRoot(), - localExecutionOptions, - executionOptions.verboseFailures, - env.getRuntime().getProductName(), - ResourceManager.instance()), + new StandaloneSpawnStrategy(executionOptions.verboseFailures, createLocalRunner(env)), new DummyIncludeScanningContext(), new SpawnGccStrategy(), testStrategy, new ExclusiveTestStrategy(testStrategy), new FileWriteStrategy()); } + + private static SpawnRunner createLocalRunner(CommandEnvironment env) { + LocalExecutionOptions localExecutionOptions = + env.getOptions().getOptions(LocalExecutionOptions.class); + LocalEnvProvider localEnvProvider = OS.getCurrent() == OS.DARWIN + ? new XCodeLocalEnvProvider() + : LocalEnvProvider.UNMODIFIED; + return + new LocalSpawnRunner( + env.getExecRoot(), + localExecutionOptions, + ResourceManager.instance(), + env.getRuntime().getProductName(), + localEnvProvider); + } } diff --git a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java index f62e2b7bdf..495d46d362 100644 --- a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java +++ b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java @@ -13,152 +13,19 @@ // limitations under the License. package com.google.devtools.build.lib.standalone; -import com.google.common.eventbus.EventBus; -import com.google.devtools.build.lib.actions.ActionExecutionContext; -import com.google.devtools.build.lib.actions.ActionInput; -import com.google.devtools.build.lib.actions.ActionInputFileCache; -import com.google.devtools.build.lib.actions.ActionStatusMessage; -import com.google.devtools.build.lib.actions.Artifact.ArtifactExpander; -import com.google.devtools.build.lib.actions.ExecException; import com.google.devtools.build.lib.actions.ExecutionStrategy; -import com.google.devtools.build.lib.actions.ResourceManager; -import com.google.devtools.build.lib.actions.Spawn; import com.google.devtools.build.lib.actions.SpawnActionContext; -import com.google.devtools.build.lib.actions.Spawns; -import com.google.devtools.build.lib.actions.UserExecException; -import com.google.devtools.build.lib.exec.SpawnExecException; -import com.google.devtools.build.lib.exec.SpawnInputExpander; -import com.google.devtools.build.lib.exec.SpawnResult; -import com.google.devtools.build.lib.exec.SpawnResult.Status; -import com.google.devtools.build.lib.exec.SpawnRunner.ProgressStatus; -import com.google.devtools.build.lib.exec.SpawnRunner.SpawnExecutionPolicy; -import com.google.devtools.build.lib.exec.apple.XCodeLocalEnvProvider; -import com.google.devtools.build.lib.exec.local.LocalEnvProvider; -import com.google.devtools.build.lib.exec.local.LocalExecutionOptions; -import com.google.devtools.build.lib.exec.local.LocalSpawnRunner; -import com.google.devtools.build.lib.rules.fileset.FilesetActionContext; -import com.google.devtools.build.lib.util.CommandFailureUtils; -import com.google.devtools.build.lib.util.OS; -import com.google.devtools.build.lib.util.io.FileOutErr; -import com.google.devtools.build.lib.vfs.Path; -import com.google.devtools.build.lib.vfs.PathFragment; -import java.io.IOException; -import java.util.SortedMap; -import java.util.concurrent.atomic.AtomicInteger; +import com.google.devtools.build.lib.exec.AbstractSpawnStrategy; +import com.google.devtools.build.lib.exec.SpawnRunner; /** * Strategy that uses subprocessing to execute a process. */ @ExecutionStrategy(name = { "standalone", "local" }, contextType = SpawnActionContext.class) -public class StandaloneSpawnStrategy implements SpawnActionContext { - private final boolean verboseFailures; - private final LocalSpawnRunner localSpawnRunner; - private final AtomicInteger execCount = new AtomicInteger(); - +public class StandaloneSpawnStrategy extends AbstractSpawnStrategy { public StandaloneSpawnStrategy( - Path execRoot, LocalExecutionOptions localExecutionOptions, boolean verboseFailures, - String productName, ResourceManager resourceManager) { - this.verboseFailures = verboseFailures; - LocalEnvProvider localEnvProvider = OS.getCurrent() == OS.DARWIN - ? new XCodeLocalEnvProvider() - : LocalEnvProvider.UNMODIFIED; - this.localSpawnRunner = new LocalSpawnRunner( - execRoot, - localExecutionOptions, - resourceManager, - productName, - localEnvProvider); - } - - /** - * Executes the given {@code spawn}. - */ - @Override - public void exec(final Spawn spawn, final ActionExecutionContext actionExecutionContext) - throws ExecException, InterruptedException { - final int timeoutSeconds = Spawns.getTimeoutSeconds(spawn); - final EventBus eventBus = actionExecutionContext.getEventBus(); - SpawnExecutionPolicy policy = new SpawnExecutionPolicy() { - private final int id = execCount.incrementAndGet(); - - @Override - public int getId() { - return id; - } - - @Override - public void prefetchInputs(Iterable<ActionInput> inputs) throws IOException { - if (Spawns.shouldPrefetchInputsForLocalExecution(spawn)) { - actionExecutionContext.getActionInputPrefetcher().prefetchFiles(inputs); - } - } - - @Override - public ActionInputFileCache getActionInputFileCache() { - return actionExecutionContext.getActionInputFileCache(); - } - - @Override - public ArtifactExpander getArtifactExpander() { - return actionExecutionContext.getArtifactExpander(); - } - - @Override - public void lockOutputFiles() throws InterruptedException { - // Do nothing for now. - } - - @Override - public long getTimeoutMillis() { - return timeoutSeconds * 1000L; - } - - @Override - public FileOutErr getFileOutErr() { - return actionExecutionContext.getFileOutErr(); - } - - @Override - public SortedMap<PathFragment, ActionInput> getInputMapping() throws IOException { - return new SpawnInputExpander(/*strict*/false) - .getInputMapping( - spawn, - actionExecutionContext.getArtifactExpander(), - actionExecutionContext.getActionInputFileCache(), - actionExecutionContext.getContext(FilesetActionContext.class)); - } - - @Override - public void report(ProgressStatus state, String name) { - switch (state) { - case EXECUTING: - eventBus.post(ActionStatusMessage.runningStrategy(spawn.getResourceOwner(), name)); - break; - case SCHEDULING: - eventBus.post(ActionStatusMessage.schedulingStrategy(spawn.getResourceOwner())); - break; - default: - break; - } - } - }; - - if (actionExecutionContext.reportsSubcommands()) { - actionExecutionContext.reportSubcommand(spawn); - } - - try { - SpawnResult result = localSpawnRunner.exec(spawn, policy); - if (result.status() != Status.SUCCESS || result.exitCode() != 0) { - String message = - CommandFailureUtils.describeCommandFailure( - verboseFailures, spawn.getArguments(), spawn.getEnvironment(), null); - throw new SpawnExecException( - message, result, /*forciblyRunRemotely=*/false, /*catastrophe=*/false); - } - } catch (IOException e) { - throw new UserExecException("I/O exception during local execution", e); - } + boolean verboseFailures, SpawnRunner spawnRunner) { + super(verboseFailures, spawnRunner); } @Override |