aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main
diff options
context:
space:
mode:
authorGravatar olaola <olaola@google.com>2017-07-20 21:06:48 +0200
committerGravatar Klaus Aehlig <aehlig@google.com>2017-07-21 09:15:11 +0200
commitf82666fcd1aad63992775816fdd14c6ec0f2ad4d (patch)
tree1920d386d85b16c9aa8666f63972eba4de65f1e3 /src/main
parent2462f35c04f24f6ab8b7e28d838086ec3586ad45 (diff)
Fix #3416: catch the ALREADY_EXISTS status code on upload, and treat it as success.
This can happen per spec, if multiple builds try to upload the same blob concurrently. Also, added this to the RemoteWorker, per spec. PiperOrigin-RevId: 162647548
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/ByteStreamUploader.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/GrpcRemoteCache.java21
2 files changed, 12 insertions, 16 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/remote/ByteStreamUploader.java b/src/main/java/com/google/devtools/build/lib/remote/ByteStreamUploader.java
index 4ee108e2e7..aa8f9b529a 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/ByteStreamUploader.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/ByteStreamUploader.java
@@ -39,6 +39,7 @@ import io.grpc.Channel;
import io.grpc.ClientCall;
import io.grpc.Metadata;
import io.grpc.Status;
+import io.grpc.Status.Code;
import io.grpc.StatusException;
import java.io.IOException;
import java.util.ArrayList;
@@ -352,10 +353,10 @@ final class ByteStreamUploader {
@Override
public void onClose(Status status, Metadata trailers) {
- if (!status.isOk()) {
- listener.failure(status);
- } else {
+ if (status.isOk() || Code.ALREADY_EXISTS.equals(status.getCode())) {
listener.success();
+ } else {
+ listener.failure(status);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/remote/GrpcRemoteCache.java b/src/main/java/com/google/devtools/build/lib/remote/GrpcRemoteCache.java
index 1c97f21f60..c637a8dfff 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/GrpcRemoteCache.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/GrpcRemoteCache.java
@@ -145,15 +145,15 @@ public class GrpcRemoteCache implements RemoteActionCache {
ImmutableSet<Digest> missingDigests = getMissingDigests(repository.getAllDigests(root));
// Only upload data that was missing from the cache.
- ArrayList<ActionInput> actionInputs = new ArrayList<>();
- ArrayList<Directory> treeNodes = new ArrayList<>();
- repository.getDataFromDigests(missingDigests, actionInputs, treeNodes);
+ ArrayList<ActionInput> missingActionInputs = new ArrayList<>();
+ ArrayList<Directory> missingTreeNodes = new ArrayList<>();
+ repository.getDataFromDigests(missingDigests, missingActionInputs, missingTreeNodes);
- if (!treeNodes.isEmpty()) {
+ if (!missingTreeNodes.isEmpty()) {
// TODO(olaola): split this into multiple requests if total size is > 10MB.
BatchUpdateBlobsRequest.Builder treeBlobRequest =
BatchUpdateBlobsRequest.newBuilder().setInstanceName(options.remoteInstanceName);
- for (Directory d : treeNodes) {
+ for (Directory d : missingTreeNodes) {
byte[] data = d.toByteArray();
treeBlobRequest
.addRequestsBuilder()
@@ -173,17 +173,12 @@ public class GrpcRemoteCache implements RemoteActionCache {
});
}
uploadBlob(command.toByteArray());
- if (!actionInputs.isEmpty()) {
+ if (!missingActionInputs.isEmpty()) {
List<Chunker> inputsToUpload = new ArrayList<>();
ActionInputFileCache inputFileCache = repository.getInputFileCache();
- for (ActionInput actionInput : actionInputs) {
- Digest digest = Digests.getDigestFromInputCache(actionInput, inputFileCache);
- if (missingDigests.contains(digest)) {
- Chunker chunker = new Chunker(actionInput, inputFileCache, execRoot);
- inputsToUpload.add(chunker);
- }
+ for (ActionInput actionInput : missingActionInputs) {
+ inputsToUpload.add(new Chunker(actionInput, inputFileCache, execRoot));
}
-
uploader.uploadBlobs(inputsToUpload);
}
}