diff options
author | 2017-12-11 07:53:15 -0800 | |
---|---|---|
committer | 2017-12-11 07:57:24 -0800 | |
commit | a22d0e9c14e58b29d81f5a83bdcc6e5fce52eafe (patch) | |
tree | 305828b0cc64d6b9564b23ca311704abde8a9335 /src/main/java/com/google/devtools/build/lib/remote | |
parent | 180d25660cc5b1272497e30a1cdc494ac5eadf77 (diff) |
Fix: uploading artifacts of failed actions to remote cache stopped working.
To reproduce: run a failing test with --experimental_remote_spawn_cache or with --spawn_strategy=remote and no executor. Expected: test log is uploaded.
Desired behavior:
- regardless of whether a spawn is cacheable or not, its artifacts should be uploaded to the remote cache.
- the spawn result should only be set if the spawn is cacheable *and* the action succeeded.
- when executing remotely, the do_not_cache field should be set for non-cacheable spawns, and the remote execution engine should respect it.
This CL contains multiple fixes to ensure the above behaviors, and adds a few tests, both end to end and unit tests. Important behavior change: it is no longer assumed that non-cacheable spawns should use a NO_CACHE SpawnCache! The appropriate test case was removed. Instead, an assumption was added that all implementations of SpawnCache should respect the Spawns.mayBeCached(spawn) property. Currently, only NO_CACHE and RemoteSpawnCache exist, and they (now) support it.
TESTED=remote build execution backend.
WANT_LGTM: philwo,buchgr
RELNOTES: None
PiperOrigin-RevId: 178617937
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/remote')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnCache.java | 13 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java | 16 |
2 files changed, 22 insertions, 7 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnCache.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnCache.java index 57f19fa258..91e27cd49c 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnCache.java +++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnCache.java @@ -19,6 +19,7 @@ import com.google.devtools.build.lib.actions.ExecutionStrategy; import com.google.devtools.build.lib.actions.Spawn; import com.google.devtools.build.lib.actions.SpawnResult; import com.google.devtools.build.lib.actions.SpawnResult.Status; +import com.google.devtools.build.lib.actions.Spawns; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.Reporter; @@ -102,7 +103,8 @@ final class RemoteSpawnCache implements SpawnCache { digestUtil.compute(command), repository.getMerkleDigest(inputRoot), platform, - policy.getTimeout()); + policy.getTimeout(), + Spawns.mayBeCached(spawn)); // Look up action cache, and reuse the action output if it is found. final ActionKey actionKey = digestUtil.computeActionKey(action); @@ -113,7 +115,9 @@ final class RemoteSpawnCache implements SpawnCache { Context previous = withMetadata.attach(); try { ActionResult result = - this.options.remoteAcceptCached ? remoteCache.getCachedActionResult(actionKey) : null; + this.options.remoteAcceptCached && Spawns.mayBeCached(spawn) + ? 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 @@ -156,7 +160,10 @@ final class RemoteSpawnCache implements SpawnCache { @Override public void store(SpawnResult result, Collection<Path> files) throws InterruptedException, IOException { - boolean uploadAction = Status.SUCCESS.equals(result.status()) && result.exitCode() == 0; + boolean uploadAction = + Spawns.mayBeCached(spawn) + && Status.SUCCESS.equals(result.status()) + && result.exitCode() == 0; Context previous = withMetadata.attach(); try { remoteCache.upload(actionKey, execRoot, files, policy.getFileOutErr(), uploadAction); diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java index c67ef489a6..c63975738b 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java +++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java @@ -130,7 +130,8 @@ class RemoteSpawnRunner implements SpawnRunner { digestUtil.compute(command), repository.getMerkleDigest(inputRoot), platform, - policy.getTimeout()); + policy.getTimeout(), + Spawns.mayBeCached(spawn)); // Look up action cache, and reuse the action output if it is found. ActionKey actionKey = digestUtil.computeActionKey(action); @@ -262,7 +263,8 @@ class RemoteSpawnRunner implements SpawnRunner { Digest command, Digest inputRoot, Platform platform, - Duration timeout) { + Duration timeout, + boolean cacheable) { Action.Builder action = Action.newBuilder(); action.setCommandDigest(command); action.setInputRootDigest(inputRoot); @@ -279,6 +281,9 @@ class RemoteSpawnRunner implements SpawnRunner { if (!timeout.isZero()) { action.setTimeout(com.google.protobuf.Duration.newBuilder().setSeconds(timeout.getSeconds())); } + if (!cacheable) { + action.setDoNotCache(true); + } return action.build(); } @@ -326,7 +331,7 @@ class RemoteSpawnRunner implements SpawnRunner { @Nullable RemoteActionCache remoteCache, @Nullable ActionKey actionKey) throws ExecException, IOException, InterruptedException { - if (uploadToCache && Spawns.mayBeCached(spawn) && remoteCache != null && actionKey != null) { + if (uploadToCache && remoteCache != null && actionKey != null) { return execLocallyAndUpload(spawn, policy, inputMap, remoteCache, actionKey); } return fallbackRunner.exec(spawn, policy); @@ -351,7 +356,10 @@ class RemoteSpawnRunner implements SpawnRunner { } List<Path> outputFiles = listExistingOutputFiles(execRoot, spawn); try { - boolean uploadAction = Status.SUCCESS.equals(result.status()) && result.exitCode() == 0; + boolean uploadAction = + Spawns.mayBeCached(spawn) + && Status.SUCCESS.equals(result.status()) + && result.exitCode() == 0; remoteCache.upload(actionKey, execRoot, outputFiles, policy.getFileOutErr(), uploadAction); } catch (IOException e) { if (verboseFailures) { |