diff options
author | olaola <olaola@google.com> | 2017-07-20 21:06:48 +0200 |
---|---|---|
committer | Klaus Aehlig <aehlig@google.com> | 2017-07-21 09:15:11 +0200 |
commit | f82666fcd1aad63992775816fdd14c6ec0f2ad4d (patch) | |
tree | 1920d386d85b16c9aa8666f63972eba4de65f1e3 /src/test | |
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/test')
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/remote/GrpcRemoteCacheTest.java | 44 |
1 files changed, 44 insertions, 0 deletions
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<FindMissingBlobsResponse> responseObserver) { + responseObserver.onNext( + FindMissingBlobsResponse.newBuilder().addMissingBlobDigests(digest).build()); + responseObserver.onCompleted(); + } + }); + final AtomicBoolean sentError = new AtomicBoolean(false); + serviceRegistry.addService( + new ByteStreamImplBase() { + @Override + public StreamObserver<WriteRequest> write( + final StreamObserver<WriteResponse> responseObserver) { + return new StreamObserver<WriteRequest>() { + @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<WriteRequest> { private final StreamObserver<WriteResponse> responseObserver; private final String contents; |