From f82666fcd1aad63992775816fdd14c6ec0f2ad4d Mon Sep 17 00:00:00 2001 From: olaola Date: Thu, 20 Jul 2017 21:06:48 +0200 Subject: 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 --- .../build/lib/remote/GrpcRemoteCacheTest.java | 44 ++++++++++++++++++++++ 1 file changed, 44 insertions(+) (limited to 'src/test/java/com') diff --git a/src/test/java/com/google/devtools/build/lib/remote/GrpcRemoteCacheTest.java b/src/test/java/com/google/devtools/build/lib/remote/GrpcRemoteCacheTest.java index 81b63fa5f3..c43a09f690 100644 --- a/src/test/java/com/google/devtools/build/lib/remote/GrpcRemoteCacheTest.java +++ b/src/test/java/com/google/devtools/build/lib/remote/GrpcRemoteCacheTest.java @@ -59,6 +59,7 @@ import io.grpc.inprocess.InProcessServerBuilder; import io.grpc.stub.StreamObserver; import io.grpc.util.MutableHandlerRegistry; import java.io.IOException; +import java.util.concurrent.atomic.AtomicBoolean; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -284,6 +285,49 @@ public class GrpcRemoteCacheTest { assertThat(client.uploadBlob("abcdefg".getBytes(UTF_8))).isEqualTo(digest); } + @Test + public void testUploadBlobRemoteAlreadyExists() throws Exception { + final GrpcRemoteCache client = newClient(); + final Digest digest = Digests.computeDigestUtf8("abcdefg"); + serviceRegistry.addService( + new ContentAddressableStorageImplBase() { + @Override + public void findMissingBlobs( + FindMissingBlobsRequest request, + StreamObserver responseObserver) { + responseObserver.onNext( + FindMissingBlobsResponse.newBuilder().addMissingBlobDigests(digest).build()); + responseObserver.onCompleted(); + } + }); + final AtomicBoolean sentError = new AtomicBoolean(false); + serviceRegistry.addService( + new ByteStreamImplBase() { + @Override + public StreamObserver write( + final StreamObserver responseObserver) { + return new StreamObserver() { + @Override + public void onNext(WriteRequest request) { + responseObserver.onError(Status.ALREADY_EXISTS.asRuntimeException()); + sentError.set(true); + } + + @Override + public void onCompleted() { + } + + @Override + public void onError(Throwable t) { + fail("An error occurred: " + t); + } + }; + } + }); + assertThat(client.uploadBlob("abcdefg".getBytes(UTF_8))).isEqualTo(digest); + assertThat(sentError.get()).isTrue(); + } + static class TestChunkedRequestObserver implements StreamObserver { private final StreamObserver responseObserver; private final String contents; -- cgit v1.2.3