diff options
author | 2017-07-20 21:06:48 +0200 | |
---|---|---|
committer | 2017-07-21 09:15:11 +0200 | |
commit | f82666fcd1aad63992775816fdd14c6ec0f2ad4d (patch) | |
tree | 1920d386d85b16c9aa8666f63972eba4de65f1e3 /src/main | |
parent | 2462f35c04f24f6ab8b7e28d838086ec3586ad45 (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.java | 7 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/remote/GrpcRemoteCache.java | 21 |
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); } } |