aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/standalone
diff options
context:
space:
mode:
authorGravatar Ulf Adams <ulfjack@google.com>2017-03-02 17:32:28 +0000
committerGravatar Yue Gan <yueg@google.com>2017-03-03 10:36:39 +0000
commitcddaaa66b9aac7c4ea4772ae2a23b97426d267c2 (patch)
treeeb018b744eff97144ccc2fb3850dfc184b907236 /src/main/java/com/google/devtools/build/lib/standalone
parent64f3eb0492f675d0e4713989f2bdd175ff078758 (diff)
Rationalize local resource acquisition
Move all local resource acquisition to where local execution actually happens. Don't attempt to acquire resources per action, but only for individual spawns. This significantly simplifies the code. The downside is that we don't account for action-level work anymore. In general, actions should not perform any process execution themselves, but always delegate such work to a SpawnStrategy implementation. This change makes sure that every Spawn has local resources set in a way that is consistent with the previous state. However, there are two actions - Fileset and FileWrite -, which are not spawns, and so we now don't limit their concurrent execution anymore. For Fileset, all work is done in a custom Fileset-specific thread pool, so this shouldn't be a problem. I'm not sure about FileWriteAction. -- PiperOrigin-RevId: 149012600 MOS_MIGRATED_REVID=149012600
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/standalone')
-rw-r--r--src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java31
1 files changed, 27 insertions, 4 deletions
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 9dc4b757aa..6e2b3ce4ae 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
@@ -14,11 +14,15 @@
package com.google.devtools.build.lib.standalone;
import com.google.common.collect.ImmutableMap;
+import com.google.common.eventbus.EventBus;
import com.google.devtools.build.lib.actions.ActionExecutionContext;
+import com.google.devtools.build.lib.actions.ActionExecutionMetadata;
import com.google.devtools.build.lib.actions.ActionStatusMessage;
import com.google.devtools.build.lib.actions.ExecException;
import com.google.devtools.build.lib.actions.ExecutionStrategy;
import com.google.devtools.build.lib.actions.Executor;
+import com.google.devtools.build.lib.actions.ResourceManager;
+import com.google.devtools.build.lib.actions.ResourceManager.ResourceHandle;
import com.google.devtools.build.lib.actions.Spawn;
import com.google.devtools.build.lib.actions.SpawnActionContext;
import com.google.devtools.build.lib.actions.Spawns;
@@ -48,13 +52,20 @@ public class StandaloneSpawnStrategy implements SpawnActionContext {
private final Path processWrapper;
private final Path execRoot;
private final String productName;
+ private final ResourceManager resourceManager;
public StandaloneSpawnStrategy(Path execRoot, boolean verboseFailures, String productName) {
+ this(execRoot, verboseFailures, productName, ResourceManager.instance());
+ }
+
+ public StandaloneSpawnStrategy(
+ Path execRoot, boolean verboseFailures, String productName, ResourceManager resourceManager) {
this.verboseFailures = verboseFailures;
this.execRoot = execRoot;
this.processWrapper = execRoot.getRelative(
"_bin/process-wrapper" + OsUtils.executableExtension());
this.productName = productName;
+ this.resourceManager = resourceManager;
}
/**
@@ -63,6 +74,22 @@ public class StandaloneSpawnStrategy implements SpawnActionContext {
@Override
public void exec(Spawn spawn,
ActionExecutionContext actionExecutionContext)
+ throws ExecException, InterruptedException {
+ EventBus eventBus = actionExecutionContext.getExecutor().getEventBus();
+ ActionExecutionMetadata owner = spawn.getResourceOwner();
+ eventBus.post(ActionStatusMessage.schedulingStrategy(owner));
+ try (ResourceHandle handle =
+ resourceManager.acquireResources(owner, spawn.getLocalResources())) {
+ eventBus.post(ActionStatusMessage.runningStrategy(owner, "standalone"));
+ actuallyExec(spawn, actionExecutionContext);
+ }
+ }
+
+ /**
+ * Executes the given {@code spawn}.
+ */
+ private void actuallyExec(Spawn spawn,
+ ActionExecutionContext actionExecutionContext)
throws ExecException {
Executor executor = actionExecutionContext.getExecutor();
@@ -70,10 +97,6 @@ public class StandaloneSpawnStrategy implements SpawnActionContext {
executor.reportSubcommand(spawn);
}
- executor
- .getEventBus()
- .post(ActionStatusMessage.runningStrategy(spawn.getResourceOwner(), "standalone"));
-
int timeoutSeconds = Spawns.getTimeoutSeconds(spawn);
// We must wrap the subprocess with process-wrapper to kill the process tree.