Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import com.google.cloud.storage.Conversions.Decoder;
import com.google.cloud.storage.Retrying.Retrier;
import com.google.cloud.storage.StorageException.IOExceptionCallable;
import com.google.cloud.storage.multipartupload.model.AbortMultipartUploadRequest;
import com.google.cloud.storage.multipartupload.model.AbortMultipartUploadResponse;
import com.google.cloud.storage.multipartupload.model.CompleteMultipartUploadRequest;
Expand All @@ -29,6 +30,8 @@
import com.google.cloud.storage.multipartupload.model.ListPartsResponse;
import com.google.cloud.storage.multipartupload.model.UploadPartRequest;
import com.google.cloud.storage.multipartupload.model.UploadPartResponse;
import java.io.IOException;
import java.util.concurrent.Callable;
import java.util.concurrent.atomic.AtomicBoolean;

/**
Expand All @@ -54,7 +57,7 @@ final class MultipartUploadClientImpl extends MultipartUploadClient {
public CreateMultipartUploadResponse createMultipartUpload(CreateMultipartUploadRequest request) {
return retrier.run(
retryAlgorithmManager.nonIdempotent(),
() -> httpRequestManager.sendCreateMultipartUploadRequest(request),
translateIOException(() -> httpRequestManager.sendCreateMultipartUploadRequest(request)),
Decoder.identity());
}

Expand All @@ -63,7 +66,7 @@ public ListPartsResponse listParts(ListPartsRequest request) {

return retrier.run(
retryAlgorithmManager.idempotent(),
() -> httpRequestManager.sendListPartsRequest(request),
translateIOException(() -> httpRequestManager.sendListPartsRequest(request)),
Decoder.identity());
}

Expand All @@ -72,7 +75,7 @@ public AbortMultipartUploadResponse abortMultipartUpload(AbortMultipartUploadReq

return retrier.run(
retryAlgorithmManager.idempotent(),
() -> httpRequestManager.sendAbortMultipartUploadRequest(request),
translateIOException(() -> httpRequestManager.sendAbortMultipartUploadRequest(request)),
Decoder.identity());
}

Expand All @@ -81,7 +84,7 @@ public CompleteMultipartUploadResponse completeMultipartUpload(
CompleteMultipartUploadRequest request) {
return retrier.run(
retryAlgorithmManager.idempotent(),
() -> httpRequestManager.sendCompleteMultipartUploadRequest(request),
translateIOException(() -> httpRequestManager.sendCompleteMultipartUploadRequest(request)),
Decoder.identity());
}

Expand All @@ -90,20 +93,37 @@ public UploadPartResponse uploadPart(UploadPartRequest request, RequestBody requ
AtomicBoolean dirty = new AtomicBoolean(false);
return retrier.run(
retryAlgorithmManager.idempotent(),
() -> {
if (dirty.getAndSet(true)) {
requestBody.getContent().rewindTo(0);
}
return httpRequestManager.sendUploadPartRequest(request, requestBody.getContent());
},
translateIOException(
() -> {
if (dirty.getAndSet(true)) {
requestBody.getContent().rewindTo(0);
}
return httpRequestManager.sendUploadPartRequest(request, requestBody.getContent());
}),
Decoder.identity());
}

@Override
public ListMultipartUploadsResponse listMultipartUploads(ListMultipartUploadsRequest request) {
return retrier.run(
retryAlgorithmManager.idempotent(),
() -> httpRequestManager.sendListMultipartUploadsRequest(request),
translateIOException(() -> httpRequestManager.sendListMultipartUploadsRequest(request)),
Decoder.identity());
}

/**
* XML API requests surface error responses as a plain {@link
* com.google.api.client.http.HttpResponseException}. Translate any {@link IOException} into a
* {@link StorageException} before it reaches the retrier so the HTTP status code is preserved and
* the retry algorithm can classify it (e.g. 503 as retryable).
*/
private static <T> Callable<T> translateIOException(IOExceptionCallable<T> c) {
return () -> {
try {
return c.call();
} catch (IOException e) {
throw StorageException.translate(e);
}
};
}
}
Loading
Loading