diff options
author | 2016-02-10 15:38:59 +0000 | |
---|---|---|
committer | 2016-02-10 16:34:53 +0000 | |
commit | 79adf59e2973754c8c0415fcab45cd58c7c34697 (patch) | |
tree | 2e56ff05720321037078b779bf0463e91578fc6a /src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java | |
parent | 63b856f79629a91ed041c1385d8a9bcf8a258c33 (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.java | 81 |
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(); + } +} |