aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar Ulf Adams <ulfjack@google.com>2016-10-31 16:52:48 +0000
committerGravatar Laszlo Csomor <laszlocsomor@google.com>2016-11-02 08:25:42 +0000
commita0e3af46ca41f55163188d4beef10534c006aaca (patch)
treed9cc68a79c856f7d536244d17267e7c7ea0e2c87 /src/main/java/com/google/devtools
parent03afc7d463149860df6e7c7aa04a6325bb9391e3 (diff)
Refactor the module API to use the builder pattern for executor creation.
This significantly simplifies several of our modules. -- MOS_MIGRATED_REVID=137713119
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/actions/ExecutorBuilder.java64
-rw-r--r--src/main/java/com/google/devtools/build/lib/actions/SimpleActionContextProvider.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/BazelWorkspaceStatusModule.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java32
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java84
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java27
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/sandbox/SandboxModule.java49
-rw-r--r--src/main/java/com/google/devtools/build/lib/standalone/StandaloneModule.java40
-rw-r--r--src/main/java/com/google/devtools/build/lib/worker/WorkerModule.java28
11 files changed, 163 insertions, 224 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ExecutorBuilder.java b/src/main/java/com/google/devtools/build/lib/actions/ExecutorBuilder.java
new file mode 100644
index 0000000000..c25fc07245
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/actions/ExecutorBuilder.java
@@ -0,0 +1,64 @@
+// Copyright 2016 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.actions;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.actions.Executor.ActionContext;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Builder class to create an {@link Executor} instance. This class is part of the module API,
+ * which allows modules to affect how the executor is initialized.
+ */
+public class ExecutorBuilder {
+ private final List<ActionContextProvider> actionContextProviders = new ArrayList<>();
+ private final List<ActionContextConsumer> actionContextConsumers = new ArrayList<>();
+
+ // These methods shouldn't be public, but they have to be right now as ExecutionTool is in another
+ // package.
+ public ImmutableList<ActionContextProvider> getActionContextProviders() {
+ return ImmutableList.copyOf(actionContextProviders);
+ }
+
+ public ImmutableList<ActionContextConsumer> getActionContextConsumers() {
+ return ImmutableList.copyOf(actionContextConsumers);
+ }
+
+ /**
+ * Adds the specified action context providers to the executor.
+ */
+ public ExecutorBuilder addActionContextProvider(ActionContextProvider provider) {
+ this.actionContextProviders.add(provider);
+ return this;
+ }
+
+ /**
+ * Adds the specified action context to the executor, by wrapping it in a simple action context
+ * provider implementation.
+ */
+ public ExecutorBuilder addActionContext(ActionContext context) {
+ return addActionContextProvider(new SimpleActionContextProvider(context));
+ }
+
+ /**
+ * Adds the specified action context consumer to the executor.
+ */
+ public ExecutorBuilder addActionContextConsumer(ActionContextConsumer consumer) {
+ this.actionContextConsumers.add(consumer);
+ return this;
+ }
+
+}
+
diff --git a/src/main/java/com/google/devtools/build/lib/actions/SimpleActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/actions/SimpleActionContextProvider.java
index 1239ccb0f9..642bc09ada 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/SimpleActionContextProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/SimpleActionContextProvider.java
@@ -15,25 +15,15 @@ package com.google.devtools.build.lib.actions;
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.actions.Executor.ActionContext;
-
import java.util.List;
/**
* An {@link ActionContextProvider} that just provides the {@link ActionContext}s it's given.
*/
-public class SimpleActionContextProvider extends ActionContextProvider {
-
- /**
- * Creates an immutable list containing a single SimpleActionContextProvider with the given
- * contexts as a convenience for BlazeModule.getActionContextProviders().
- */
- public static List<ActionContextProvider> of(ActionContext ... contexts) {
- return ImmutableList.<ActionContextProvider>of(new SimpleActionContextProvider(contexts));
- }
-
+final class SimpleActionContextProvider extends ActionContextProvider {
private final List<ActionContext> actionContexts;
- public SimpleActionContextProvider(ActionContext ... contexts) {
+ public SimpleActionContextProvider(ActionContext... contexts) {
actionContexts = ImmutableList.<ActionContext>copyOf(contexts);
}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/BazelWorkspaceStatusModule.java b/src/main/java/com/google/devtools/build/lib/bazel/BazelWorkspaceStatusModule.java
index 7f205f8299..569ce9f839 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/BazelWorkspaceStatusModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/BazelWorkspaceStatusModule.java
@@ -22,7 +22,6 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.eventbus.Subscribe;
-import com.google.devtools.build.lib.actions.ActionContextProvider;
import com.google.devtools.build.lib.actions.ActionExecutionContext;
import com.google.devtools.build.lib.actions.ActionExecutionException;
import com.google.devtools.build.lib.actions.ActionOwner;
@@ -31,14 +30,15 @@ import com.google.devtools.build.lib.actions.ArtifactFactory;
import com.google.devtools.build.lib.actions.ArtifactOwner;
import com.google.devtools.build.lib.actions.ExecutionStrategy;
import com.google.devtools.build.lib.actions.Executor;
+import com.google.devtools.build.lib.actions.ExecutorBuilder;
import com.google.devtools.build.lib.actions.ResourceSet;
import com.google.devtools.build.lib.actions.Root;
-import com.google.devtools.build.lib.actions.SimpleActionContextProvider;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.BuildInfo;
import com.google.devtools.build.lib.analysis.WorkspaceStatusAction;
import com.google.devtools.build.lib.analysis.WorkspaceStatusAction.Key;
import com.google.devtools.build.lib.analysis.WorkspaceStatusAction.KeyType;
+import com.google.devtools.build.lib.buildtool.BuildRequest;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.runtime.BlazeModule;
import com.google.devtools.build.lib.runtime.Command;
@@ -246,7 +246,6 @@ public class BazelWorkspaceStatusModule extends BlazeModule {
}
private class BazelStatusActionFactory implements WorkspaceStatusAction.Factory {
-
private String hostname;
@Override
@@ -286,7 +285,13 @@ public class BazelWorkspaceStatusModule extends BlazeModule {
}
@ExecutionStrategy(contextType = WorkspaceStatusAction.Context.class)
- private class BazelWorkspaceStatusActionContext implements WorkspaceStatusAction.Context {
+ private static final class BazelWorkspaceStatusActionContext
+ implements WorkspaceStatusAction.Context {
+ private final WorkspaceStatusAction.Options options;
+
+ private BazelWorkspaceStatusActionContext(WorkspaceStatusAction.Options options) {
+ this.options = options;
+ }
@Override
public ImmutableMap<String, Key> getStableKeys() {
@@ -339,12 +344,12 @@ public class BazelWorkspaceStatusModule extends BlazeModule {
}
@Override
- public Iterable<ActionContextProvider> getActionContextProviders() {
- return SimpleActionContextProvider.of(new BazelWorkspaceStatusActionContext());
+ public void workspaceInit(BlazeDirectories directories, WorkspaceBuilder builder) {
+ builder.setWorkspaceStatusActionFactory(new BazelStatusActionFactory());
}
@Override
- public void workspaceInit(BlazeDirectories directories, WorkspaceBuilder builder) {
- builder.setWorkspaceStatusActionFactory(new BazelStatusActionFactory());
+ public void executorInit(CommandEnvironment env, BuildRequest request, ExecutorBuilder builder) {
+ builder.addActionContext(new BazelWorkspaceStatusActionContext(options));
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java
index 0fe4aa2a4a..314e4404ba 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java
@@ -16,13 +16,11 @@ package com.google.devtools.build.lib.bazel.rules;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableList;
-import com.google.common.eventbus.Subscribe;
-import com.google.devtools.build.lib.actions.ActionContextConsumer;
-import com.google.devtools.build.lib.actions.ActionContextProvider;
-import com.google.devtools.build.lib.actions.SimpleActionContextProvider;
+import com.google.devtools.build.lib.actions.ExecutorBuilder;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.bazel.rules.cpp.BazelCppRuleClasses;
+import com.google.devtools.build.lib.buildtool.BuildRequest;
import com.google.devtools.build.lib.query2.output.OutputFormatter;
import com.google.devtools.build.lib.rules.android.WriteAdbArgsActionContext;
import com.google.devtools.build.lib.rules.cpp.FdoSupportFunction;
@@ -31,7 +29,6 @@ import com.google.devtools.build.lib.rules.genquery.GenQuery;
import com.google.devtools.build.lib.runtime.BlazeModule;
import com.google.devtools.build.lib.runtime.Command;
import com.google.devtools.build.lib.runtime.CommandEnvironment;
-import com.google.devtools.build.lib.runtime.GotOptionsEvent;
import com.google.devtools.build.lib.runtime.WorkspaceBuilder;
import com.google.devtools.build.lib.skyframe.PrecomputedValue;
import com.google.devtools.build.lib.util.ResourceFileLoader;
@@ -84,7 +81,6 @@ public class BazelRulesModule extends BlazeModule {
}
private CommandEnvironment env;
- protected BazelExecutionOptions options;
@Override
public void beforeCommand(Command command, CommandEnvironment env) {
@@ -95,7 +91,6 @@ public class BazelRulesModule extends BlazeModule {
@Override
public void afterCommand() {
this.env = null;
- this.options = null;
}
@Override
@@ -106,22 +101,6 @@ public class BazelRulesModule extends BlazeModule {
}
@Override
- public Iterable<ActionContextProvider> getActionContextProviders() {
- return ImmutableList.<ActionContextProvider>of(new SimpleActionContextProvider(
- new WriteAdbArgsActionContext(env.getClientEnv().get("HOME"))));
- }
-
- @Override
- public Iterable<ActionContextConsumer> getActionContextConsumers() {
- return ImmutableList.<ActionContextConsumer>of(new BazelActionContextConsumer(options));
- }
-
- @Subscribe
- public void gotOptions(GotOptionsEvent event) {
- options = event.getOptions().getOptions(BazelExecutionOptions.class);
- }
-
- @Override
public void initializeRuleClasses(ConfiguredRuleClassProvider.Builder builder) {
builder.setToolsRepository(BazelRuleClassProvider.TOOLS_REPOSITORY);
BazelRuleClassProvider.setup(builder);
@@ -149,4 +128,11 @@ public class BazelRulesModule extends BlazeModule {
}
}));
}
+
+ @Override
+ public void executorInit(CommandEnvironment env, BuildRequest request, ExecutorBuilder builder) {
+ builder.addActionContext(new WriteAdbArgsActionContext(env.getClientEnv().get("HOME")));
+ BazelExecutionOptions options = env.getOptions().getOptions(BazelExecutionOptions.class);
+ builder.addActionContextConsumer(new BazelActionContextConsumer(options));
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
index 891c2cff38..7543b539df 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
@@ -43,11 +43,11 @@ 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.Executor.ActionContext;
+import com.google.devtools.build.lib.actions.ExecutorBuilder;
import com.google.devtools.build.lib.actions.ExecutorInitException;
import com.google.devtools.build.lib.actions.LocalHostCapacity;
import com.google.devtools.build.lib.actions.ResourceManager;
import com.google.devtools.build.lib.actions.ResourceSet;
-import com.google.devtools.build.lib.actions.SimpleActionContextProvider;
import com.google.devtools.build.lib.actions.SpawnActionContext;
import com.google.devtools.build.lib.actions.TestExecException;
import com.google.devtools.build.lib.actions.cache.ActionCache;
@@ -187,39 +187,38 @@ public class ExecutionTool {
// determine whether the host actually supports certain strategies (e.g. sandboxing).
createToolsSymlinks();
- this.actionContextProviders =
- getActionContextProvidersFromModules(
- runtime,
- new FilesetActionContextImpl.Provider(
- env.getReporter(), env.getWorkspaceName()),
- new SimpleActionContextProvider(
- new SymlinkTreeStrategy(
- env.getOutputService(), env.getBlazeWorkspace().getBinTools())));
+ ExecutorBuilder builder = new ExecutorBuilder();
+ for (BlazeModule module : runtime.getBlazeModules()) {
+ module.executorInit(env, request, builder);
+ }
+ builder.addActionContextProvider(
+ new FilesetActionContextImpl.Provider(env.getReporter(), env.getWorkspaceName()));
+ builder.addActionContext(new SymlinkTreeStrategy(
+ env.getOutputService(), env.getBlazeWorkspace().getBinTools()));
+ // TODO(philwo) - the ExecutionTool should not add arbitrary dependencies on its own, instead
+ // these dependencies should be added to the ActionContextConsumer of the module that actually
+ // depends on them.
+ builder.addActionContextConsumer(
+ new ActionContextConsumer() {
+ @Override
+ public ImmutableMap<String, String> getSpawnActionContexts() {
+ return ImmutableMap.of();
+ }
+
+ @Override
+ public Multimap<Class<? extends ActionContext>, String> getActionContexts() {
+ return ImmutableMultimap.<Class<? extends ActionContext>, String>builder()
+ .put(FilesetActionContext.class, "")
+ .put(WorkspaceStatusAction.Context.class, "")
+ .put(SymlinkTreeActionContext.class, "")
+ .build();
+ }
+ });
+
+ this.actionContextProviders = builder.getActionContextProviders();
StrategyConverter strategyConverter = new StrategyConverter(actionContextProviders);
- ImmutableList<ActionContextConsumer> actionContextConsumers =
- getActionContextConsumersFromModules(
- runtime,
- // TODO(philwo) - the ExecutionTool should not add arbitrary dependencies on its own,
- // instead these dependencies should be added to the ActionContextConsumer of the module
- // that actually depends on them.
- new ActionContextConsumer() {
- @Override
- public ImmutableMap<String, String> getSpawnActionContexts() {
- return ImmutableMap.of();
- }
-
- @Override
- public Multimap<Class<? extends ActionContext>, String> getActionContexts() {
- return ImmutableMultimap.<Class<? extends ActionContext>, String>builder()
- .put(FilesetActionContext.class, "")
- .put(WorkspaceStatusAction.Context.class, "")
- .put(SymlinkTreeActionContext.class, "")
- .build();
- }
- });
-
- for (ActionContextConsumer consumer : actionContextConsumers) {
+ for (ActionContextConsumer consumer : builder.getActionContextConsumers()) {
// There are many different SpawnActions, and we want to control the action context they use
// independently from each other, for example, to run genrules locally and Java compile action
// in prod. Thus, for SpawnActions, we decide the action context to use not only based on the
@@ -259,26 +258,6 @@ public class ExecutionTool {
strategies.add(context);
}
- private static ImmutableList<ActionContextConsumer> getActionContextConsumersFromModules(
- BlazeRuntime runtime, ActionContextConsumer... extraConsumers) {
- ImmutableList.Builder<ActionContextConsumer> builder = ImmutableList.builder();
- for (BlazeModule module : runtime.getBlazeModules()) {
- builder.addAll(module.getActionContextConsumers());
- }
- builder.add(extraConsumers);
- return builder.build();
- }
-
- private static ImmutableList<ActionContextProvider> getActionContextProvidersFromModules(
- BlazeRuntime runtime, ActionContextProvider... extraProviders) {
- ImmutableList.Builder<ActionContextProvider> builder = ImmutableList.builder();
- for (BlazeModule module : runtime.getBlazeModules()) {
- builder.addAll(module.getActionContextProviders());
- }
- builder.add(extraProviders);
- return builder.build();
- }
-
private static ExecutorInitException makeExceptionForInvalidStrategyValue(String value,
String strategy, String validValues) {
return new ExecutorInitException(String.format(
@@ -602,7 +581,6 @@ public class ExecutionTool {
* file, iff the --explain flag is specified during a build.
*/
private static class ExplanationHandler implements EventHandler {
-
private final PrintWriter log;
private ExplanationHandler(OutputStream log, String optionsDescription) {
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java
index 7db69e8af7..52343b0799 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java
@@ -16,7 +16,7 @@ package com.google.devtools.build.lib.remote;
import com.google.common.collect.ImmutableList;
import com.google.common.eventbus.Subscribe;
-import com.google.devtools.build.lib.actions.ActionContextProvider;
+import com.google.devtools.build.lib.actions.ExecutorBuilder;
import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
import com.google.devtools.build.lib.buildtool.BuildRequest;
import com.google.devtools.build.lib.buildtool.buildevent.BuildStartingEvent;
@@ -29,18 +29,9 @@ import com.google.devtools.common.options.OptionsBase;
/** RemoteModule provides distributed cache and remote execution for Bazel. */
public final class RemoteModule extends BlazeModule {
private CommandEnvironment env;
- private BuildRequest buildRequest;
private RemoteActionCache actionCache;
private RemoteWorkExecutor workExecutor;
- public RemoteModule() {}
-
- @Override
- public Iterable<ActionContextProvider> getActionContextProviders() {
- return ImmutableList.<ActionContextProvider>of(
- new RemoteActionContextProvider(env, buildRequest, actionCache, workExecutor));
- }
-
@Override
public void beforeCommand(Command command, CommandEnvironment env) {
this.env = env;
@@ -50,13 +41,17 @@ public final class RemoteModule extends BlazeModule {
@Override
public void afterCommand() {
this.env = null;
- this.buildRequest = null;
+ }
+
+ @Override
+ public void executorInit(CommandEnvironment env, BuildRequest request, ExecutorBuilder builder) {
+ builder.addActionContextProvider(
+ new RemoteActionContextProvider(env, request, actionCache, workExecutor));
}
@Subscribe
public void buildStarting(BuildStartingEvent event) {
- buildRequest = event.getRequest();
- RemoteOptions options = buildRequest.getOptions(RemoteOptions.class);
+ RemoteOptions options = event.getRequest().getOptions(RemoteOptions.class);
try {
// Reinitialize the remote cache and worker from options every time, because the options
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java
index e6cce932fb..cea042feaf 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java
@@ -14,13 +14,13 @@
package com.google.devtools.build.lib.runtime;
import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.actions.ActionContextConsumer;
-import com.google.devtools.build.lib.actions.ActionContextProvider;
import com.google.devtools.build.lib.actions.ActionInputFileCache;
+import com.google.devtools.build.lib.actions.ExecutorBuilder;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.BlazeVersionInfo;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.ServerDirectories;
+import com.google.devtools.build.lib.buildtool.BuildRequest;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.exec.ActionInputPrefetcher;
import com.google.devtools.build.lib.exec.OutputService;
@@ -213,24 +213,15 @@ public abstract class BlazeModule {
}
/**
- * Returns the action context providers the module contributes to Blaze, if any.
+ * Called when Bazel initializes the action execution subsystem. This is called once per build if
+ * action execution is enabled. Modules can override this method to affect how execution is
+ * performed.
*
- * <p>This method will be called at the beginning of the execution phase, e.g. of the
- * "blaze build" command.
+ * @param env the command environment
+ * @param request the build request
+ * @param builder the builder to add action context providers and consumers to
*/
- public Iterable<ActionContextProvider> getActionContextProviders() {
- return ImmutableList.of();
- }
-
- /**
- * Returns the action context consumers that pulls in action contexts required by this module,
- * if any.
- *
- * <p>This method will be called at the beginning of the execution phase, e.g. of the
- * "blaze build" command.
- */
- public Iterable<ActionContextConsumer> getActionContextConsumers() {
- return ImmutableList.of();
+ public void executorInit(CommandEnvironment env, BuildRequest request, ExecutorBuilder builder) {
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
index e22b09b007..c72c05e337 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
@@ -93,6 +93,8 @@ public final class CommandEnvironment {
private ImmutableList<ActionInputPrefetcher> actionInputPrefetchers = ImmutableList.of();
private Path workingDirectory;
+ private OptionsClassProvider options;
+
private AtomicReference<AbruptExitException> pendingException = new AtomicReference<>();
private class BlazeModuleEnvironment implements BlazeModule.ModuleEnvironment {
@@ -180,6 +182,10 @@ public final class CommandEnvironment {
return Collections.unmodifiableMap(clientEnv);
}
+ public OptionsClassProvider getOptions() {
+ return options;
+ }
+
/**
* Return an ordered version of the client environment restricted to those variables whitelisted
* by the command-line options to be inheritable by actions.
@@ -527,6 +533,7 @@ public final class CommandEnvironment {
throw new IllegalStateException(e);
}
}
+ this.options = optionsParser;
eventBus.post(new GotOptionsEvent(runtime.getStartupOptionsProvider(), optionsParser));
throwPendingException();
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxModule.java b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxModule.java
index 8334e00ffa..a8b67139b1 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxModule.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxModule.java
@@ -15,15 +15,11 @@
package com.google.devtools.build.lib.sandbox;
import com.google.common.collect.ImmutableList;
-import com.google.common.eventbus.Subscribe;
-import com.google.devtools.build.lib.actions.ActionContextConsumer;
-import com.google.devtools.build.lib.actions.ActionContextProvider;
+import com.google.devtools.build.lib.actions.ExecutorBuilder;
import com.google.devtools.build.lib.buildtool.BuildRequest;
-import com.google.devtools.build.lib.buildtool.buildevent.BuildStartingEvent;
import com.google.devtools.build.lib.runtime.BlazeModule;
import com.google.devtools.build.lib.runtime.Command;
import com.google.devtools.build.lib.runtime.CommandEnvironment;
-import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.common.options.OptionsBase;
import java.io.IOException;
@@ -31,28 +27,6 @@ import java.io.IOException;
* This module provides the Sandbox spawn strategy.
*/
public final class SandboxModule extends BlazeModule {
- // Per-command state
- private CommandEnvironment env;
- private BuildRequest buildRequest;
-
- @Override
- public Iterable<ActionContextProvider> getActionContextProviders() {
- Preconditions.checkNotNull(env);
- Preconditions.checkNotNull(buildRequest);
- try {
- return ImmutableList.<ActionContextProvider>of(
- SandboxActionContextProvider.create(env, buildRequest));
- } catch (IOException e) {
- throw new IllegalStateException(e);
- }
- }
-
- @Override
- public Iterable<ActionContextConsumer> getActionContextConsumers() {
- Preconditions.checkNotNull(env);
- return ImmutableList.<ActionContextConsumer>of(new SandboxActionContextConsumer(env));
- }
-
@Override
public Iterable<Class<? extends OptionsBase>> getCommandOptions(Command command) {
return "build".equals(command.name())
@@ -61,19 +35,12 @@ public final class SandboxModule extends BlazeModule {
}
@Override
- public void beforeCommand(Command command, CommandEnvironment env) {
- this.env = env;
- env.getEventBus().register(this);
- }
-
- @Override
- public void afterCommand() {
- env = null;
- buildRequest = null;
- }
-
- @Subscribe
- public void buildStarting(BuildStartingEvent event) {
- buildRequest = event.getRequest();
+ public void executorInit(CommandEnvironment env, BuildRequest request, ExecutorBuilder builder) {
+ try {
+ builder.addActionContextProvider(SandboxActionContextProvider.create(env, request));
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ builder.addActionContextConsumer(new SandboxActionContextConsumer(env));
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneModule.java b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneModule.java
index 58145b0ad3..bde53f0a5e 100644
--- a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneModule.java
+++ b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneModule.java
@@ -13,50 +13,18 @@
// limitations under the License.
package com.google.devtools.build.lib.standalone;
-import com.google.common.collect.ImmutableList;
-import com.google.common.eventbus.Subscribe;
-import com.google.devtools.build.lib.actions.ActionContextConsumer;
-import com.google.devtools.build.lib.actions.ActionContextProvider;
+import com.google.devtools.build.lib.actions.ExecutorBuilder;
import com.google.devtools.build.lib.buildtool.BuildRequest;
-import com.google.devtools.build.lib.buildtool.buildevent.BuildStartingEvent;
import com.google.devtools.build.lib.runtime.BlazeModule;
-import com.google.devtools.build.lib.runtime.Command;
import com.google.devtools.build.lib.runtime.CommandEnvironment;
-import com.google.devtools.build.lib.util.Preconditions;
/**
* StandaloneModule provides pluggable functionality for blaze.
*/
public class StandaloneModule extends BlazeModule {
- private CommandEnvironment env;
- private BuildRequest buildRequest;
-
- @Override
- public Iterable<ActionContextConsumer> getActionContextConsumers() {
- Preconditions.checkNotNull(env);
- return ImmutableList.<ActionContextConsumer>of(new StandaloneActionContextConsumer());
- }
-
- @Override
- public Iterable<ActionContextProvider> getActionContextProviders() {
- return ImmutableList.<ActionContextProvider>of(
- new StandaloneActionContextProvider(env, buildRequest));
- }
-
- @Override
- public void beforeCommand(Command command, CommandEnvironment env) {
- this.env = env;
- env.getEventBus().register(this);
- }
-
@Override
- public void afterCommand() {
- this.env = null;
- this.buildRequest = null;
- }
-
- @Subscribe
- public void buildStarting(BuildStartingEvent event) {
- buildRequest = event.getRequest();
+ public void executorInit(CommandEnvironment env, BuildRequest request, ExecutorBuilder builder) {
+ builder.addActionContextProvider(new StandaloneActionContextProvider(env, request));
+ builder.addActionContextConsumer(new StandaloneActionContextConsumer());
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/worker/WorkerModule.java b/src/main/java/com/google/devtools/build/lib/worker/WorkerModule.java
index c57a1687b6..1ec0122146 100644
--- a/src/main/java/com/google/devtools/build/lib/worker/WorkerModule.java
+++ b/src/main/java/com/google/devtools/build/lib/worker/WorkerModule.java
@@ -15,8 +15,7 @@ package com.google.devtools.build.lib.worker;
import com.google.common.collect.ImmutableList;
import com.google.common.eventbus.Subscribe;
-import com.google.devtools.build.lib.actions.ActionContextConsumer;
-import com.google.devtools.build.lib.actions.ActionContextProvider;
+import com.google.devtools.build.lib.actions.ExecutorBuilder;
import com.google.devtools.build.lib.buildtool.BuildRequest;
import com.google.devtools.build.lib.buildtool.buildevent.BuildCompleteEvent;
import com.google.devtools.build.lib.buildtool.buildevent.BuildInterruptedEvent;
@@ -35,7 +34,6 @@ import java.io.IOException;
*/
public class WorkerModule extends BlazeModule {
private CommandEnvironment env;
- private BuildRequest buildRequest;
private WorkerFactory workerFactory;
private WorkerPool workerPool;
@@ -57,8 +55,7 @@ public class WorkerModule extends BlazeModule {
@Subscribe
public void buildStarting(BuildStartingEvent event) {
- buildRequest = event.getRequest();
- options = buildRequest.getOptions(WorkerOptions.class);
+ options = event.getRequest().getOptions(WorkerOptions.class);
if (workerFactory == null) {
Path workerDir =
@@ -133,25 +130,17 @@ public class WorkerModule extends BlazeModule {
}
@Override
- public Iterable<ActionContextProvider> getActionContextProviders() {
- Preconditions.checkNotNull(env);
- Preconditions.checkNotNull(buildRequest);
+ public void executorInit(CommandEnvironment env, BuildRequest request, ExecutorBuilder builder) {
Preconditions.checkNotNull(workerPool);
-
- return ImmutableList.<ActionContextProvider>of(
- new WorkerActionContextProvider(env, buildRequest, workerPool));
- }
-
- @Override
- public Iterable<ActionContextConsumer> getActionContextConsumers() {
- return ImmutableList.<ActionContextConsumer>of(new WorkerActionContextConsumer());
+ builder.addActionContextProvider(
+ new WorkerActionContextProvider(env, request, workerPool));
+ builder.addActionContextConsumer(new WorkerActionContextConsumer());
}
@Subscribe
public void buildComplete(BuildCompleteEvent event) {
- if (buildRequest != null
- && buildRequest.getOptions(WorkerOptions.class) != null
- && buildRequest.getOptions(WorkerOptions.class).workerQuitAfterBuild) {
+ if (options != null
+ && options.workerQuitAfterBuild) {
shutdownPool("Build completed, shutting down worker pool...");
}
}
@@ -182,7 +171,6 @@ public class WorkerModule extends BlazeModule {
@Override
public void afterCommand() {
this.env = null;
- this.buildRequest = null;
this.options = null;
if (this.workerFactory != null) {