diff options
author | 2017-09-12 13:44:42 +0200 | |
---|---|---|
committer | 2017-09-12 14:09:10 +0200 | |
commit | bbb4a401d45c1a814e89a056781b635282e010f7 (patch) | |
tree | b1026dc1235709ce9062b2b934a05ba5d1cd9f81 /src | |
parent | 8f499c94b250a6c92662a8b50b0761d3966c4894 (diff) |
Delete the unused CachedLocalSpawnRunner, which is superseeded by SpawnCache
PiperOrigin-RevId: 168359681
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/remote/CachedLocalSpawnRunner.java | 105 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/remote/CachedLocalSpawnRunnerTest.java | 205 |
2 files changed, 0 insertions, 310 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/remote/CachedLocalSpawnRunner.java b/src/main/java/com/google/devtools/build/lib/remote/CachedLocalSpawnRunner.java deleted file mode 100644 index 3c5a4c9404..0000000000 --- a/src/main/java/com/google/devtools/build/lib/remote/CachedLocalSpawnRunner.java +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2017 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.devtools.build.lib.actions.ActionInput; -import com.google.devtools.build.lib.actions.ExecException; -import com.google.devtools.build.lib.actions.Spawn; -import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; -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; -import com.google.devtools.build.lib.remote.Digests.ActionKey; -import com.google.devtools.build.lib.remote.TreeNodeRepository.TreeNode; -import com.google.devtools.build.lib.vfs.Path; -import com.google.devtools.build.lib.vfs.PathFragment; -import com.google.devtools.remoteexecution.v1test.Action; -import com.google.devtools.remoteexecution.v1test.ActionResult; -import com.google.devtools.remoteexecution.v1test.Command; -import com.google.devtools.remoteexecution.v1test.Platform; -import java.io.IOException; -import java.util.List; -import java.util.SortedMap; - -/** - * A {@link SpawnRunner} implementation that adds a remote cache on top of an underlying local - * {@link SpawnRunner} implementation. - */ -@ThreadSafe // If RemoteActionCache and SpawnRunner implementations are thread-safe. -final class CachedLocalSpawnRunner implements SpawnRunner { - private final Path execRoot; - private final RemoteOptions options; - // TODO(olaola): This will be set on a per-action basis instead. - private final Platform platform; - - private final RemoteActionCache remoteCache; - private final SpawnRunner delegate; - - CachedLocalSpawnRunner( - Path execRoot, RemoteOptions options, RemoteActionCache remoteCache, SpawnRunner delegate) { - this.execRoot = execRoot; - this.options = options; - this.platform = options.parseRemotePlatformOverride(); - this.remoteCache = remoteCache; - this.delegate = delegate; - } - - @Override - public SpawnResult exec(Spawn spawn, SpawnExecutionPolicy policy) - throws InterruptedException, IOException, ExecException { - - // Temporary hack: the TreeNodeRepository should be created and maintained upstream! - TreeNodeRepository repository = - new TreeNodeRepository(execRoot, policy.getActionInputFileCache()); - SortedMap<PathFragment, ActionInput> inputMap = policy.getInputMapping(); - TreeNode inputRoot = repository.buildFromActionInputs(inputMap); - repository.computeMerkleDigests(inputRoot); - Command command = - RemoteSpawnRunner.buildCommand(spawn.getArguments(), spawn.getEnvironment()); - Action action = - RemoteSpawnRunner.buildAction( - spawn.getOutputFiles(), - Digests.computeDigest(command), - repository.getMerkleDigest(inputRoot), - platform, - policy.getTimeout()); - - // Look up action cache, and reuse the action output if it is found. - ActionKey actionKey = Digests.computeActionKey(action); - ActionResult result = - this.options.remoteAcceptCached ? remoteCache.getCachedActionResult(actionKey) : null; - if (result != null) { - // We don't cache failed actions, so we know the outputs exist. - // For now, download all outputs locally; in the future, we can reuse the digests to - // just update the TreeNodeRepository and continue the build. - try { - remoteCache.download(result, execRoot, policy.getFileOutErr()); - return new SpawnResult.Builder() - .setStatus(Status.SUCCESS) - .setExitCode(result.getExitCode()) - .build(); - } catch (CacheNotFoundException e) { - // There's a cache miss. Fall back to local execution. - } - } - SpawnResult spawnResult = delegate.exec(spawn, policy); - if (options.remoteUploadLocalResults - && spawnResult.status() == Status.SUCCESS - && spawnResult.exitCode() == 0) { - List<Path> outputFiles = RemoteSpawnRunner.listExistingOutputFiles(execRoot, spawn); - remoteCache.upload(actionKey, execRoot, outputFiles, policy.getFileOutErr()); - } - return spawnResult; - } -} diff --git a/src/test/java/com/google/devtools/build/lib/remote/CachedLocalSpawnRunnerTest.java b/src/test/java/com/google/devtools/build/lib/remote/CachedLocalSpawnRunnerTest.java deleted file mode 100644 index e26dd1fc84..0000000000 --- a/src/test/java/com/google/devtools/build/lib/remote/CachedLocalSpawnRunnerTest.java +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright 2017 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 static com.google.common.truth.Truth.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.devtools.build.lib.actions.ActionInput; -import com.google.devtools.build.lib.actions.ActionInputFileCache; -import com.google.devtools.build.lib.actions.ActionInputHelper; -import com.google.devtools.build.lib.actions.Artifact; -import com.google.devtools.build.lib.actions.Artifact.ArtifactExpander; -import com.google.devtools.build.lib.actions.ResourceSet; -import com.google.devtools.build.lib.actions.SimpleSpawn; -import com.google.devtools.build.lib.actions.Spawn; -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; -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.util.FakeOwner; -import com.google.devtools.build.lib.remote.Digests.ActionKey; -import com.google.devtools.build.lib.remote.TreeNodeRepository.TreeNode; -import com.google.devtools.build.lib.util.io.FileOutErr; -import com.google.devtools.build.lib.vfs.FileSystem; -import com.google.devtools.build.lib.vfs.FileSystemUtils; -import com.google.devtools.build.lib.vfs.Path; -import com.google.devtools.build.lib.vfs.PathFragment; -import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem; -import com.google.devtools.common.options.Options; -import com.google.devtools.remoteexecution.v1test.ActionResult; -import com.google.devtools.remoteexecution.v1test.Command; -import java.io.IOException; -import java.time.Duration; -import java.util.Collection; -import java.util.SortedMap; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -/** Tests for {@link CachedLocalSpawnRunner}. */ -@RunWith(JUnit4.class) -public class CachedLocalSpawnRunnerTest { - private static final ArtifactExpander SIMPLE_ARTIFACT_EXPANDER = - new ArtifactExpander() { - @Override - public void expand(Artifact artifact, Collection<? super Artifact> output) { - output.add(artifact); - } - }; - - private FileSystem fs; - private Path execRoot; - private SimpleSpawn simpleSpawn; - private FakeActionInputFileCache fakeFileCache; - @Mock private RemoteActionCache cache; - @Mock private SpawnRunner delegate; - private CachedLocalSpawnRunner runner; - private FileOutErr outErr; - - private final SpawnExecutionPolicy simplePolicy = - new SpawnExecutionPolicy() { - @Override - public int getId() { - return 0; - } - - @Override - public void prefetchInputs() { - // CachedLocalSpawnRunner should never prefetch itself, though the nested SpawnRunner may. - throw new UnsupportedOperationException(); - } - - @Override - public void lockOutputFiles() throws InterruptedException { - throw new UnsupportedOperationException(); - } - - @Override - public boolean speculating() { - return false; - } - - @Override - public ActionInputFileCache getActionInputFileCache() { - return fakeFileCache; - } - - @Override - public ArtifactExpander getArtifactExpander() { - throw new UnsupportedOperationException(); - } - - @Override - public Duration getTimeout() { - return Duration.ZERO; - } - - @Override - public FileOutErr getFileOutErr() { - return outErr; - } - - @Override - public SortedMap<PathFragment, ActionInput> getInputMapping() throws IOException { - return new SpawnInputExpander(/*strict*/ false) - .getInputMapping(simpleSpawn, SIMPLE_ARTIFACT_EXPANDER, fakeFileCache, "workspace"); - } - - @Override - public void report(ProgressStatus state, String name) { - // TODO(ulfjack): Test that the right calls are made. - } - }; - - @Before - public final void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - fs = new InMemoryFileSystem(); - execRoot = fs.getPath("/exec/root"); - FileSystemUtils.createDirectoryAndParents(execRoot); - fakeFileCache = new FakeActionInputFileCache(execRoot); - simpleSpawn = - new SimpleSpawn( - new FakeOwner("Mnemonic", "Progress Message"), - ImmutableList.of("/bin/echo", "Hi!"), - ImmutableMap.of("VARIABLE", "value"), - /*executionInfo=*/ ImmutableMap.<String, String>of(), - /*inputs=*/ ImmutableList.of(ActionInputHelper.fromPath("input")), - /*outputs=*/ ImmutableList.<ActionInput>of(), - ResourceSet.ZERO); - - Path stdout = fs.getPath("/tmp/stdout"); - Path stderr = fs.getPath("/tmp/stderr"); - FileSystemUtils.createDirectoryAndParents(stdout.getParentDirectory()); - FileSystemUtils.createDirectoryAndParents(stderr.getParentDirectory()); - outErr = new FileOutErr(stdout, stderr); - RemoteOptions options = Options.getDefaults(RemoteOptions.class); - runner = new CachedLocalSpawnRunner(execRoot, options, cache, delegate); - fakeFileCache.createScratchInput(simpleSpawn.getInputFiles().get(0), "xyz"); - } - - @SuppressWarnings("unchecked") - @Test - public void cacheHit() throws Exception { - ActionResult actionResult = ActionResult.getDefaultInstance(); - when(cache.getCachedActionResult(any(ActionKey.class))).thenReturn(actionResult); - - SpawnResult result = runner.exec(simpleSpawn, simplePolicy); - // All other methods on RemoteActionCache have side effects, so we verify all of them. - verify(cache).download(actionResult, execRoot, outErr); - verify(cache, never()) - .ensureInputsPresent( - any(TreeNodeRepository.class), - any(Path.class), - any(TreeNode.class), - any(Command.class)); - verify(cache, never()) - .upload( - any(ActionKey.class), any(Path.class), any(Collection.class), any(FileOutErr.class)); - assertThat(result.setupSuccess()).isTrue(); - assertThat(result.exitCode()).isEqualTo(0); - // We expect the CachedLocalSpawnRunner to _not_ write to outErr at all. - assertThat(outErr.hasRecordedOutput()).isFalse(); - assertThat(outErr.hasRecordedStderr()).isFalse(); - } - - @SuppressWarnings("unchecked") - @Test - public void cacheMiss() throws Exception { - when(delegate.exec(any(Spawn.class), any(SpawnExecutionPolicy.class))) - .thenReturn(new SpawnResult.Builder().setExitCode(0).setStatus(Status.SUCCESS).build()); - - SpawnResult result = runner.exec(simpleSpawn, simplePolicy); - assertThat(result.setupSuccess()).isTrue(); - assertThat(result.exitCode()).isEqualTo(0); - verify(cache) - .upload( - any(ActionKey.class), - any(Path.class), - any(Collection.class), - eq(outErr)); - } -} |