remote: support inlining of stdout/stderr in repository_rule
Send a hint to the server that it should inline stdout and stderr
in its cached response. For servers that support it this will save
one round trip per repository_ctx.execute().
Closes #10987.
PiperOrigin-RevId: 302395949
diff --git a/src/main/java/com/google/devtools/build/lib/remote/GrpcCacheClient.java b/src/main/java/com/google/devtools/build/lib/remote/GrpcCacheClient.java
index c53186a..4f567c1 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/GrpcCacheClient.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/GrpcCacheClient.java
@@ -232,11 +232,14 @@
}
@Override
- public ListenableFuture<ActionResult> downloadActionResult(ActionKey actionKey) {
+ public ListenableFuture<ActionResult> downloadActionResult(
+ ActionKey actionKey, boolean inlineOutErr) {
GetActionResultRequest request =
GetActionResultRequest.newBuilder()
.setInstanceName(options.remoteInstanceName)
.setActionDigest(actionKey.getDigest())
+ .setInlineStderr(inlineOutErr)
+ .setInlineStdout(inlineOutErr)
.build();
Context ctx = Context.current();
return retrier.executeAsync(
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteCache.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteCache.java
index 4df9100..1a1be30 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteCache.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteCache.java
@@ -114,9 +114,9 @@
this.digestUtil = digestUtil;
}
- public ActionResult downloadActionResult(ActionKey actionKey)
+ public ActionResult downloadActionResult(ActionKey actionKey, boolean inlineOutErr)
throws IOException, InterruptedException {
- return Utils.getFromFuture(cacheProtocol.downloadActionResult(actionKey));
+ return Utils.getFromFuture(cacheProtocol.downloadActionResult(actionKey, inlineOutErr));
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteRepositoryRemoteExecutor.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteRepositoryRemoteExecutor.java
index d4e9d54..612851b 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteRepositoryRemoteExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteRepositoryRemoteExecutor.java
@@ -111,7 +111,8 @@
commandHash, merkleTree.getRootDigest(), timeout, acceptCached);
Digest actionDigest = digestUtil.compute(action);
ActionKey actionKey = new ActionKey(actionDigest);
- ActionResult actionResult = remoteCache.downloadActionResult(actionKey);
+ ActionResult actionResult =
+ remoteCache.downloadActionResult(actionKey, /* inlineOutErr= */ true);
if (actionResult == null || actionResult.getExitCode() != 0) {
Map<Digest, Message> additionalInputs = Maps.newHashMapWithExpectedSize(2);
additionalInputs.put(actionDigest, action);
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 8ce8f1d..54271d2 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
@@ -150,7 +150,7 @@
try {
ActionResult result;
try (SilentCloseable c = prof.profile(ProfilerTask.REMOTE_CACHE_CHECK, "check cache hit")) {
- result = remoteCache.downloadActionResult(actionKey);
+ result = remoteCache.downloadActionResult(actionKey, /* inlineOutErr= */ false);
}
// In case the remote cache returned a failed action (exit code != 0) we treat it as a
// cache miss
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 e6c4e0e..118ce6c 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
@@ -232,7 +232,10 @@
// Try to lookup the action in the action cache.
ActionResult cachedResult;
try (SilentCloseable c = prof.profile(ProfilerTask.REMOTE_CACHE_CHECK, "check cache hit")) {
- cachedResult = acceptCachedResult ? remoteCache.downloadActionResult(actionKey) : null;
+ cachedResult =
+ acceptCachedResult
+ ? remoteCache.downloadActionResult(actionKey, /* inlineOutErr= */ false)
+ : null;
}
if (cachedResult != null) {
if (cachedResult.getExitCode() != 0) {
diff --git a/src/main/java/com/google/devtools/build/lib/remote/common/RemoteCacheClient.java b/src/main/java/com/google/devtools/build/lib/remote/common/RemoteCacheClient.java
index 2c1bb83..ae6a151 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/common/RemoteCacheClient.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/common/RemoteCacheClient.java
@@ -67,10 +67,12 @@
* Downloads an action result for the {@code actionKey}.
*
* @param actionKey The digest of the {@link Action} that generated the action result.
+ * @param inlineOutErr A hint to the server to inline the stdout and stderr in the {@code
+ * ActionResult} message.
* @return A Future representing pending download of an action result. If an action result for
* {@code actionKey} cannot be found the result of the Future is {@code null}.
*/
- ListenableFuture<ActionResult> downloadActionResult(ActionKey actionKey);
+ ListenableFuture<ActionResult> downloadActionResult(ActionKey actionKey, boolean inlineOutErr);
/**
* Uploads an action result for the {@code actionKey}.
diff --git a/src/main/java/com/google/devtools/build/lib/remote/disk/DiskAndRemoteCacheClient.java b/src/main/java/com/google/devtools/build/lib/remote/disk/DiskAndRemoteCacheClient.java
index b14221b..33f70fc 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/disk/DiskAndRemoteCacheClient.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/disk/DiskAndRemoteCacheClient.java
@@ -163,14 +163,15 @@
}
@Override
- public ListenableFuture<ActionResult> downloadActionResult(ActionKey actionKey) {
+ public ListenableFuture<ActionResult> downloadActionResult(
+ ActionKey actionKey, boolean inlineOutErr) {
if (diskCache.containsActionResult(actionKey)) {
- return diskCache.downloadActionResult(actionKey);
+ return diskCache.downloadActionResult(actionKey, inlineOutErr);
}
if (!options.incompatibleRemoteResultsIgnoreDisk || options.remoteAcceptCached) {
return Futures.transformAsync(
- remoteCache.downloadActionResult(actionKey),
+ remoteCache.downloadActionResult(actionKey, inlineOutErr),
(actionResult) -> {
if (actionResult == null) {
return Futures.immediateFuture(null);
diff --git a/src/main/java/com/google/devtools/build/lib/remote/disk/DiskCacheClient.java b/src/main/java/com/google/devtools/build/lib/remote/disk/DiskCacheClient.java
index 2951bb7..9f1b985 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/disk/DiskCacheClient.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/disk/DiskCacheClient.java
@@ -99,7 +99,8 @@
}
@Override
- public ListenableFuture<ActionResult> downloadActionResult(ActionKey actionKey) {
+ public ListenableFuture<ActionResult> downloadActionResult(
+ ActionKey actionKey, boolean inlineOutErr) {
return Utils.downloadAsActionResult(
actionKey, (digest, out) -> download(digest, out, /* isActionCache= */ true));
}
diff --git a/src/main/java/com/google/devtools/build/lib/remote/http/HttpCacheClient.java b/src/main/java/com/google/devtools/build/lib/remote/http/HttpCacheClient.java
index c0f0051..73047a0 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/http/HttpCacheClient.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/http/HttpCacheClient.java
@@ -566,7 +566,8 @@
}
@Override
- public ListenableFuture<ActionResult> downloadActionResult(ActionKey actionKey) {
+ public ListenableFuture<ActionResult> downloadActionResult(
+ ActionKey actionKey, boolean inlineOutErr) {
return Utils.downloadAsActionResult(
actionKey, (digest, out) -> get(digest, out, /* casDownload= */ false));
}
diff --git a/src/test/java/com/google/devtools/build/lib/remote/GrpcCacheClientTest.java b/src/test/java/com/google/devtools/build/lib/remote/GrpcCacheClientTest.java
index b2d8278..5206b77 100644
--- a/src/test/java/com/google/devtools/build/lib/remote/GrpcCacheClientTest.java
+++ b/src/test/java/com/google/devtools/build/lib/remote/GrpcCacheClientTest.java
@@ -755,7 +755,8 @@
GrpcCacheClient client = newClient(remoteOptions);
RemoteCache remoteCache = new RemoteCache(client, remoteOptions, DIGEST_UTIL);
- remoteCache.downloadActionResult(DIGEST_UTIL.asActionKey(DIGEST_UTIL.computeAsUtf8("key")));
+ remoteCache.downloadActionResult(
+ DIGEST_UTIL.asActionKey(DIGEST_UTIL.computeAsUtf8("key")), /* inlineOutErr= */ false);
}
@Test
@@ -1046,7 +1047,8 @@
(numErrors-- <= 0 ? Status.NOT_FOUND : Status.UNAVAILABLE).asRuntimeException());
}
});
- assertThat(getFromFuture(client.downloadActionResult(actionKey))).isNull();
+ assertThat(getFromFuture(client.downloadActionResult(actionKey, /* inlineOutErr= */ false)))
+ .isNull();
}
@Test
diff --git a/src/test/java/com/google/devtools/build/lib/remote/RemoteRepositoryRemoteExecutorTest.java b/src/test/java/com/google/devtools/build/lib/remote/RemoteRepositoryRemoteExecutorTest.java
index 9eb4d40..7c442af 100644
--- a/src/test/java/com/google/devtools/build/lib/remote/RemoteRepositoryRemoteExecutorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/remote/RemoteRepositoryRemoteExecutorTest.java
@@ -15,6 +15,8 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -26,8 +28,10 @@
import com.google.devtools.build.lib.remote.util.DigestUtil;
import com.google.devtools.build.lib.runtime.RepositoryRemoteExecutor.ExecutionResult;
import com.google.devtools.build.lib.vfs.DigestHashFunction;
+import com.google.protobuf.ByteString;
import io.grpc.Context;
import java.io.IOException;
+import java.nio.charset.StandardCharsets;
import java.time.Duration;
import org.junit.Before;
import org.junit.Test;
@@ -67,7 +71,8 @@
// Arrange
ActionResult cachedResult = ActionResult.newBuilder().setExitCode(0).build();
- when(remoteCache.downloadActionResult(any())).thenReturn(cachedResult);
+ when(remoteCache.downloadActionResult(any(), /* inlineOutErr= */ eq(true)))
+ .thenReturn(cachedResult);
// Act
ExecutionResult executionResult =
@@ -79,20 +84,21 @@
/* timeout= */ Duration.ZERO);
// Assert
- verify(remoteCache).downloadActionResult(any());
+ verify(remoteCache).downloadActionResult(any(), anyBoolean());
// Don't fallback to execution
verify(remoteExecutor, never()).executeRemotely(any());
assertThat(executionResult.exitCode()).isEqualTo(0);
}
-
+
@Test
public void testNoneZeroExitCodeFromCache() throws IOException, InterruptedException {
// Test that an ActionResult with a none-zero exit code is not accepted as cached.
// Arrange
ActionResult cachedResult = ActionResult.newBuilder().setExitCode(1).build();
- when(remoteCache.downloadActionResult(any())).thenReturn(cachedResult);
+ when(remoteCache.downloadActionResult(any(), /* inlineOutErr= */ eq(true)))
+ .thenReturn(cachedResult);
ExecuteResponse response = ExecuteResponse.newBuilder().setResult(cachedResult).build();
when(remoteExecutor.executeRemotely(any())).thenReturn(response);
@@ -107,10 +113,46 @@
/* timeout= */ Duration.ZERO);
// Assert
- verify(remoteCache).downloadActionResult(any());
+ verify(remoteCache).downloadActionResult(any(), anyBoolean());
// Fallback to execution
verify(remoteExecutor).executeRemotely(any());
assertThat(executionResult.exitCode()).isEqualTo(1);
}
+
+ @Test
+ public void testInlineStdoutStderr() throws IOException, InterruptedException {
+ // Test that
+
+ // Arrange
+ byte[] stdout = "hello".getBytes(StandardCharsets.UTF_8);
+ byte[] stderr = "world".getBytes(StandardCharsets.UTF_8);
+ ActionResult cachedResult =
+ ActionResult.newBuilder()
+ .setExitCode(0)
+ .setStdoutRaw(ByteString.copyFrom(stdout))
+ .setStderrRaw(ByteString.copyFrom(stderr))
+ .build();
+ when(remoteCache.downloadActionResult(any(), /* inlineOutErr= */ eq(true)))
+ .thenReturn(cachedResult);
+
+ ExecuteResponse response = ExecuteResponse.newBuilder().setResult(cachedResult).build();
+ when(remoteExecutor.executeRemotely(any())).thenReturn(response);
+
+ // Act
+ ExecutionResult executionResult =
+ repoExecutor.execute(
+ ImmutableList.of("/bin/bash", "-c", "echo hello"),
+ /* executionProperties= */ ImmutableMap.of(),
+ /* environment= */ ImmutableMap.of(),
+ /* workingDirectory= */ null,
+ /* timeout= */ Duration.ZERO);
+
+ // Assert
+ verify(remoteCache).downloadActionResult(any(), /* inlineOutErr= */ eq(true));
+
+ assertThat(executionResult.exitCode()).isEqualTo(0);
+ assertThat(executionResult.stdout()).isEqualTo(stdout);
+ assertThat(executionResult.stderr()).isEqualTo(stderr);
+ }
}
diff --git a/src/test/java/com/google/devtools/build/lib/remote/RemoteSpawnCacheTest.java b/src/test/java/com/google/devtools/build/lib/remote/RemoteSpawnCacheTest.java
index 2d59327..50fe92c 100644
--- a/src/test/java/com/google/devtools/build/lib/remote/RemoteSpawnCacheTest.java
+++ b/src/test/java/com/google/devtools/build/lib/remote/RemoteSpawnCacheTest.java
@@ -270,7 +270,7 @@
@Test
public void cacheHit() throws Exception {
ActionResult actionResult = ActionResult.getDefaultInstance();
- when(remoteCache.downloadActionResult(any(ActionKey.class)))
+ when(remoteCache.downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false)))
.thenAnswer(
new Answer<ActionResult>() {
@Override
@@ -373,7 +373,8 @@
SimpleSpawn uncacheableSpawn =
simpleSpawnWithExecutionInfo(ImmutableMap.of(requirement, ""));
CacheHandle entry = remoteSpawnCache.lookup(uncacheableSpawn, simplePolicy);
- verify(remoteCache, never()).downloadActionResult(any(ActionKey.class));
+ verify(remoteCache, never())
+ .downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false));
assertThat(entry.hasResult()).isFalse();
SpawnResult result =
new SpawnResult.Builder()
@@ -405,7 +406,8 @@
ExecutionRequirements.NO_REMOTE)) {
SimpleSpawn uncacheableSpawn = simpleSpawnWithExecutionInfo(ImmutableMap.of(requirement, ""));
CacheHandle entry = remoteSpawnCache.lookup(uncacheableSpawn, simplePolicy);
- verify(remoteCache, never()).downloadActionResult(any(ActionKey.class));
+ verify(remoteCache, never())
+ .downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false));
assertThat(entry.hasResult()).isFalse();
SpawnResult result =
new SpawnResult.Builder()
@@ -438,7 +440,8 @@
ExecutionRequirements.NO_REMOTE)) {
SimpleSpawn uncacheableSpawn = simpleSpawnWithExecutionInfo(ImmutableMap.of(requirement, ""));
CacheHandle entry = remoteSpawnCache.lookup(uncacheableSpawn, simplePolicy);
- verify(remoteCache, never()).downloadActionResult(any(ActionKey.class));
+ verify(remoteCache, never())
+ .downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false));
assertThat(entry.hasResult()).isFalse();
SpawnResult result =
new SpawnResult.Builder()
@@ -461,7 +464,7 @@
SimpleSpawn cacheableSpawn =
simpleSpawnWithExecutionInfo(ImmutableMap.of(ExecutionRequirements.NO_REMOTE_CACHE, ""));
cache.lookup(cacheableSpawn, simplePolicy);
- verify(remoteCache).downloadActionResult(any(ActionKey.class));
+ verify(remoteCache).downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false));
}
@Test
@@ -469,14 +472,14 @@
SimpleSpawn cacheableSpawn =
simpleSpawnWithExecutionInfo(ImmutableMap.of(ExecutionRequirements.NO_REMOTE_EXEC, ""));
cache.lookup(cacheableSpawn, simplePolicy);
- verify(remoteCache).downloadActionResult(any(ActionKey.class));
+ verify(remoteCache).downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false));
}
@Test
public void failedActionsAreNotUploaded() throws Exception {
// Only successful action results are uploaded to the remote cache.
CacheHandle entry = cache.lookup(simpleSpawn, simplePolicy);
- verify(remoteCache).downloadActionResult(any(ActionKey.class));
+ verify(remoteCache).downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false));
assertThat(entry.hasResult()).isFalse();
SpawnResult result =
new SpawnResult.Builder()
@@ -542,7 +545,7 @@
public void printWarningIfDownloadFails() throws Exception {
doThrow(new IOException(io.grpc.Status.UNAVAILABLE.asRuntimeException()))
.when(remoteCache)
- .downloadActionResult(any(ActionKey.class));
+ .downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false));
CacheHandle entry = cache.lookup(simpleSpawn, simplePolicy);
assertThat(entry.hasResult()).isFalse();
@@ -597,7 +600,7 @@
ActionResult.newBuilder()
.addOutputFiles(OutputFile.newBuilder().setPath("/random/file").setDigest(digest))
.build();
- when(remoteCache.downloadActionResult(any(ActionKey.class)))
+ when(remoteCache.downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false)))
.thenAnswer(
new Answer<ActionResult>() {
@Override
@@ -657,7 +660,8 @@
@Test
public void failedCacheActionAsCacheMiss() throws Exception {
ActionResult actionResult = ActionResult.newBuilder().setExitCode(1).build();
- when(remoteCache.downloadActionResult(any(ActionKey.class))).thenReturn(actionResult);
+ when(remoteCache.downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false)))
+ .thenReturn(actionResult);
CacheHandle entry = cache.lookup(simpleSpawn, simplePolicy);
@@ -672,7 +676,8 @@
cache = remoteSpawnCacheWithOptions(remoteOptions);
ActionResult success = ActionResult.newBuilder().setExitCode(0).build();
- when(remoteCache.downloadActionResult(any())).thenReturn(success);
+ when(remoteCache.downloadActionResult(any(), /* inlineOutErr= */ eq(false)))
+ .thenReturn(success);
// act
CacheHandle cacheHandle = cache.lookup(simpleSpawn, simplePolicy);
@@ -693,7 +698,8 @@
IOException downloadFailure = new IOException("downloadMinimal failed");
ActionResult success = ActionResult.newBuilder().setExitCode(0).build();
- when(remoteCache.downloadActionResult(any())).thenReturn(success);
+ when(remoteCache.downloadActionResult(any(), /* inlineOutErr= */ eq(false)))
+ .thenReturn(success);
when(remoteCache.downloadMinimal(any(), anyCollection(), any(), any(), any(), any(), any()))
.thenThrow(downloadFailure);
diff --git a/src/test/java/com/google/devtools/build/lib/remote/RemoteSpawnRunnerTest.java b/src/test/java/com/google/devtools/build/lib/remote/RemoteSpawnRunnerTest.java
index 4b1e120..11a3eb2 100644
--- a/src/test/java/com/google/devtools/build/lib/remote/RemoteSpawnRunnerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/remote/RemoteSpawnRunnerTest.java
@@ -189,7 +189,8 @@
assertThat(requestCaptor.getValue().getExecutionPolicy().getPriority()).isEqualTo(2);
// TODO(olaola): verify that the uploaded action has the doNotCache set.
- verify(cache, never()).downloadActionResult(any(ActionKey.class));
+ verify(cache, never())
+ .downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false));
verify(cache, never()).upload(any(), any(), any(), any(), any(), any());
verifyZeroInteractions(localRunner);
}
@@ -305,7 +306,8 @@
remoteOptions.remoteUploadLocalResults = true;
ActionResult failedAction = ActionResult.newBuilder().setExitCode(1).build();
- when(cache.downloadActionResult(any(ActionKey.class))).thenReturn(failedAction);
+ when(cache.downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false)))
+ .thenReturn(failedAction);
RemoteSpawnRunner runner = spy(newSpawnRunner());
// Throw an IOException to trigger the local fallback.
@@ -344,7 +346,8 @@
// remotely
ActionResult failedAction = ActionResult.newBuilder().setExitCode(1).build();
- when(cache.downloadActionResult(any(ActionKey.class))).thenReturn(failedAction);
+ when(cache.downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false)))
+ .thenReturn(failedAction);
RemoteSpawnRunner runner = newSpawnRunner();
@@ -381,7 +384,8 @@
Spawn spawn = newSimpleSpawn();
SpawnExecutionContext policy = getSpawnContext(spawn);
- when(cache.downloadActionResult(any(ActionKey.class))).thenThrow(new IOException("cache down"));
+ when(cache.downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false)))
+ .thenThrow(new IOException("cache down"));
doThrow(new IOException("cache down"))
.when(cache)
@@ -421,7 +425,8 @@
Spawn spawn = newSimpleSpawn();
SpawnExecutionContext policy = getSpawnContext(spawn);
- when(cache.downloadActionResult(any(ActionKey.class))).thenReturn(null);
+ when(cache.downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false)))
+ .thenReturn(null);
IOException err = new IOException("local execution error");
when(localRunner.exec(eq(spawn), eq(policy))).thenThrow(err);
@@ -446,7 +451,8 @@
Spawn spawn = newSimpleSpawn();
SpawnExecutionContext policy = getSpawnContext(spawn);
- when(cache.downloadActionResult(any(ActionKey.class))).thenThrow(new IOException());
+ when(cache.downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false)))
+ .thenThrow(new IOException());
IOException err = new IOException("local execution error");
when(localRunner.exec(eq(spawn), eq(policy))).thenThrow(err);
@@ -463,7 +469,8 @@
RemoteSpawnRunner runner = newSpawnRunner();
- when(cache.downloadActionResult(any(ActionKey.class))).thenReturn(null);
+ when(cache.downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false)))
+ .thenReturn(null);
when(executor.executeRemotely(any(ExecuteRequest.class))).thenThrow(new IOException());
Spawn spawn = newSimpleSpawn();
@@ -590,7 +597,8 @@
RemoteSpawnRunner runner = newSpawnRunner();
ActionResult cachedResult = ActionResult.newBuilder().setExitCode(0).build();
- when(cache.downloadActionResult(any(ActionKey.class))).thenReturn(cachedResult);
+ when(cache.downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false)))
+ .thenReturn(cachedResult);
Exception downloadFailure = new CacheNotFoundException(Digest.getDefaultInstance());
doThrow(downloadFailure)
.when(cache)
@@ -618,7 +626,8 @@
RemoteSpawnRunner runner = newSpawnRunner();
- when(cache.downloadActionResult(any(ActionKey.class))).thenReturn(null);
+ when(cache.downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false)))
+ .thenReturn(null);
ActionResult cachedResult = ActionResult.newBuilder().setExitCode(0).build();
ActionResult execResult = ActionResult.newBuilder().setExitCode(31).build();
ExecuteResponse cachedResponse =
@@ -659,7 +668,8 @@
RemoteSpawnRunner runner = newSpawnRunner();
ActionResult cachedResult = ActionResult.newBuilder().setExitCode(0).build();
- when(cache.downloadActionResult(any(ActionKey.class))).thenReturn(null);
+ when(cache.downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false)))
+ .thenReturn(null);
ExecuteResponse resp =
ExecuteResponse.newBuilder()
.setResult(cachedResult)
@@ -692,7 +702,8 @@
RemoteSpawnRunner runner = newSpawnRunner();
ActionResult cachedResult = ActionResult.newBuilder().setExitCode(0).build();
- when(cache.downloadActionResult(any(ActionKey.class))).thenReturn(null);
+ when(cache.downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false)))
+ .thenReturn(null);
ExecuteResponse resp =
ExecuteResponse.newBuilder()
.setResult(cachedResult)
@@ -723,7 +734,8 @@
RemoteSpawnRunner runner = newSpawnRunner();
ActionResult cachedResult = ActionResult.newBuilder().setExitCode(0).build();
- when(cache.downloadActionResult(any(ActionKey.class))).thenReturn(null);
+ when(cache.downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false)))
+ .thenReturn(null);
ExecuteResponse failed =
ExecuteResponse.newBuilder()
.setResult(ActionResult.newBuilder().setExitCode(33).build())
@@ -752,7 +764,8 @@
RemoteSpawnRunner runner = newSpawnRunner();
- when(cache.downloadActionResult(any(ActionKey.class))).thenReturn(null);
+ when(cache.downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false)))
+ .thenReturn(null);
when(executor.executeRemotely(any(ExecuteRequest.class))).thenThrow(new IOException("reasons"));
Spawn spawn = newSimpleSpawn();
@@ -772,7 +785,8 @@
RemoteSpawnRunner runner = newSpawnRunner();
- when(cache.downloadActionResult(any(ActionKey.class))).thenThrow(new IOException("reasons"));
+ when(cache.downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false)))
+ .thenThrow(new IOException("reasons"));
Spawn spawn = newSimpleSpawn();
SpawnExecutionContext policy = getSpawnContext(spawn);
@@ -849,7 +863,8 @@
remoteOptions.remoteOutputsMode = RemoteOutputsMode.MINIMAL;
ActionResult succeededAction = ActionResult.newBuilder().setExitCode(0).build();
- when(cache.downloadActionResult(any(ActionKey.class))).thenReturn(succeededAction);
+ when(cache.downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false)))
+ .thenReturn(succeededAction);
RemoteSpawnRunner runner = newSpawnRunner();
@@ -899,7 +914,8 @@
remoteOptions.remoteOutputsMode = RemoteOutputsMode.MINIMAL;
ActionResult succeededAction = ActionResult.newBuilder().setExitCode(0).build();
- when(cache.downloadActionResult(any(ActionKey.class))).thenReturn(succeededAction);
+ when(cache.downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false)))
+ .thenReturn(succeededAction);
IOException downloadFailure = new IOException("downloadMinimal failed");
when(cache.downloadMinimal(any(), anyCollection(), any(), any(), any(), any(), any()))
.thenThrow(downloadFailure);
@@ -930,7 +946,8 @@
ActionsTestUtil.createArtifact(outputRoot, outputRoot.getRoot().getRelative("foo.bin"));
ActionResult succeededAction = ActionResult.newBuilder().setExitCode(0).build();
- when(cache.downloadActionResult(any(ActionKey.class))).thenReturn(succeededAction);
+ when(cache.downloadActionResult(any(ActionKey.class), /* inlineOutErr= */ eq(false)))
+ .thenReturn(succeededAction);
RemoteSpawnRunner runner = newSpawnRunner(ImmutableSet.of(topLevelOutput));
diff --git a/src/test/java/com/google/devtools/build/lib/remote/util/InMemoryCacheClient.java b/src/test/java/com/google/devtools/build/lib/remote/util/InMemoryCacheClient.java
index 2633e81..7ba42e6 100644
--- a/src/test/java/com/google/devtools/build/lib/remote/util/InMemoryCacheClient.java
+++ b/src/test/java/com/google/devtools/build/lib/remote/util/InMemoryCacheClient.java
@@ -89,7 +89,8 @@
}
@Override
- public ListenableFuture<ActionResult> downloadActionResult(ActionKey actionKey) {
+ public ListenableFuture<ActionResult> downloadActionResult(
+ ActionKey actionKey, boolean inlineOutErr) {
ActionResult actionResult = ac.get(actionKey);
if (actionResult == null) {
return Futures.immediateFailedFuture(new CacheNotFoundException(actionKey.getDigest()));
diff --git a/src/tools/remote/src/main/java/com/google/devtools/build/remote/worker/ActionCacheServer.java b/src/tools/remote/src/main/java/com/google/devtools/build/remote/worker/ActionCacheServer.java
index 3ac4588..a9e5d83 100644
--- a/src/tools/remote/src/main/java/com/google/devtools/build/remote/worker/ActionCacheServer.java
+++ b/src/tools/remote/src/main/java/com/google/devtools/build/remote/worker/ActionCacheServer.java
@@ -42,7 +42,7 @@
GetActionResultRequest request, StreamObserver<ActionResult> responseObserver) {
try {
ActionKey actionKey = digestUtil.asActionKey(request.getActionDigest());
- ActionResult result = cache.downloadActionResult(actionKey);
+ ActionResult result = cache.downloadActionResult(actionKey, /* inlineOutErr= */ false);
if (result == null) {
responseObserver.onError(StatusUtils.notFoundError(request.getActionDigest()));