aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java
diff options
context:
space:
mode:
authorGravatar Alpha Lam <alpha.lam.ts@gmail.com>2016-02-10 15:38:59 +0000
committerGravatar Dmitry Lomov <dslomov@google.com>2016-02-10 16:34:53 +0000
commit79adf59e2973754c8c0415fcab45cd58c7c34697 (patch)
tree2e56ff05720321037078b779bf0463e91578fc6a /src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java
parent63b856f79629a91ed041c1385d8a9bcf8a258c33 (diff)
Implement distributed caching for Bazel
This patch implements distributed caching for Bazel using Hazelcast. Hazelcast is used as a key value store that stores content of files indexed by the digest of the file. The cache also stores the list of files for an action. The key in this case is the digest from the key of the action and the list of files. In this change I also added the interface for remote execution. The implementation will be added in a subsequent patch. This change is only the first in a series of changes related to distributed caching and remote execution. I plan to revise the APIs and implementation in subsequent changes. -- Change-Id: I569285d6149a4e9f8ba2362682c07a9f1e1943b7 Reviewed-on: https://bazel-review.googlesource.com/#/c/2760/ MOS_MIGRATED_REVID=114325038
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java81
1 files changed, 81 insertions, 0 deletions
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
new file mode 100644
index 0000000000..ebc1874362
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java
@@ -0,0 +1,81 @@
+// 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.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.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.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() {
+ if (actionCache != null) {
+ return ImmutableList.<ActionContextProvider>of(
+ new RemoteActionContextProvider(env, buildRequest, actionCache, workExecutor));
+ }
+ return ImmutableList.<ActionContextProvider>of();
+ }
+
+ @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();
+ RemoteOptions options = buildRequest.getOptions(RemoteOptions.class);
+
+ // Don't provide the remote spawn unless at least action cache is initialized.
+ if (actionCache == null && options.hazelcastNode != null) {
+ actionCache =
+ new MemcacheActionCache(
+ this.env.getRuntime().getExecRoot(),
+ options,
+ HazelcastCacheFactory.create(options));
+ // TODO(alpha): Initialize a RemoteWorkExecutor.
+ }
+ }
+
+ @Override
+ public Iterable<Class<? extends OptionsBase>> getCommandOptions(Command command) {
+ return command.builds()
+ ? ImmutableList.<Class<? extends OptionsBase>>of(RemoteOptions.class)
+ : ImmutableList.<Class<? extends OptionsBase>>of();
+ }
+}