Skip to content

Commit

Permalink
Retry request on 408/timeout response from server (GoogleCloudDatapro…
Browse files Browse the repository at this point in the history
  • Loading branch information
Deependra-Patel authored and Deependra Patel committed Aug 11, 2022
1 parent cb6998b commit 899dfb8
Show file tree
Hide file tree
Showing 2 changed files with 208 additions and 196 deletions.
Expand Up @@ -418,6 +418,70 @@ public void upload_failure_runtimeException() throws Exception {
.inOrder();
}

@Test
public void upload_retry_requestTimeout() throws Exception {
byte[] testData = new byte[MediaHttpUploader.MINIMUM_CHUNK_SIZE];
new Random().nextBytes(testData);

MockHttpTransport transport =
mockTransport(
emptyResponse(HttpStatusCodes.STATUS_CODE_NOT_FOUND),
resumableUploadResponse(BUCKET_NAME, OBJECT_NAME),
emptyResponse(408), // HTTP 408 Request Timeout
jsonDataResponse(
newStorageObject(BUCKET_NAME, OBJECT_NAME)
.setSize(BigInteger.valueOf(testData.length))));

GoogleCloudStorage gcs = mockedGcs(GCS_OPTIONS, transport);

try (WritableByteChannel writeChannel = gcs.create(RESOURCE_ID)) {
writeChannel.write(ByteBuffer.wrap(testData));
}

assertThat(trackingRequestInitializerWithRetries.getAllRequestStrings())
.containsExactly(
getRequestString(BUCKET_NAME, OBJECT_NAME),
resumableUploadRequestString(
BUCKET_NAME, OBJECT_NAME, /* generationId= */ 0, /* replaceGenerationId= */ false),
resumableUploadChunkRequestString(BUCKET_NAME, OBJECT_NAME, /* uploadId= */ 1),
resumableUploadChunkRequestString(BUCKET_NAME, OBJECT_NAME, /* uploadId= */ 2))
.inOrder();
}

@Test
public void upload_noRetries_forbidden() throws Exception {
byte[] testData = new byte[MediaHttpUploader.MINIMUM_CHUNK_SIZE];
new Random().nextBytes(testData);

MockHttpTransport transport =
mockTransport(
emptyResponse(HttpStatusCodes.STATUS_CODE_NOT_FOUND),
resumableUploadResponse(BUCKET_NAME, OBJECT_NAME),
emptyResponse(HttpStatusCodes.STATUS_CODE_FORBIDDEN),
jsonDataResponse(
newStorageObject(BUCKET_NAME, OBJECT_NAME)
.setSize(BigInteger.valueOf(testData.length))));

GoogleCloudStorage gcs = mockedGcs(GCS_OPTIONS, transport);

WritableByteChannel writeChannel = gcs.create(RESOURCE_ID);
writeChannel.write(ByteBuffer.wrap(testData));

IOException thrown = assertThrows(IOException.class, writeChannel::close);
assertThat(thrown)
.hasCauseThat()
.hasMessageThat()
.contains(String.valueOf(HttpStatusCodes.STATUS_CODE_FORBIDDEN));

assertThat(trackingRequestInitializerWithRetries.getAllRequestStrings())
.containsExactly(
getRequestString(BUCKET_NAME, OBJECT_NAME),
resumableUploadRequestString(
BUCKET_NAME, OBJECT_NAME, /* generationId= */ 0, /* replaceGenerationId= */ false),
resumableUploadChunkRequestString(BUCKET_NAME, OBJECT_NAME, /* uploadId= */ 1))
.inOrder();
}

@Test
public void reupload_success_singleWrite_multipleUploadChunks() throws Exception {
byte[] testData = new byte[2 * MediaHttpUploader.MINIMUM_CHUNK_SIZE];
Expand Down

0 comments on commit 899dfb8

Please sign in to comment.