Skip to content

Commit 5800a9d

Browse files
committed
Add retry support for HTTP execution failure
Signed-off-by: Bala.FA <bala@minio.io>
1 parent a34e8c4 commit 5800a9d

3 files changed

Lines changed: 268 additions & 59 deletions

File tree

api/src/main/java/io/minio/BaseS3Client.java

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import com.fasterxml.jackson.databind.MapperFeature;
2222
import com.fasterxml.jackson.databind.ObjectMapper;
2323
import com.fasterxml.jackson.databind.json.JsonMapper;
24-
import com.google.common.collect.ImmutableSet;
2524
import io.minio.credentials.Credentials;
2625
import io.minio.credentials.Provider;
2726
import io.minio.errors.ErrorResponseException;
@@ -100,17 +99,13 @@ public abstract class BaseS3Client implements AutoCloseable {
10099
.build();
101100

102101
private static final String RETRY_HEAD = "RetryHead";
103-
private static final String END_HTTP = "----------END-HTTP----------";
104-
private static final String UPLOAD_ID = "uploadId";
105-
private static final Set<String> TRACE_QUERY_PARAMS =
106-
ImmutableSet.of("retention", "legal-hold", "tagging", UPLOAD_ID, "acl", "attributes");
107-
private PrintWriter traceStream;
102+
private volatile PrintWriter traceStream;
108103
protected final Map<String, String> regionCache = new ConcurrentHashMap<>();
109104
protected String userAgent = Utils.getDefaultUserAgent();
110105

111106
protected Http.BaseUrl baseUrl;
112107
protected Provider provider;
113-
protected OkHttpClient httpClient;
108+
protected volatile OkHttpClient httpClient;
114109
protected boolean closeHttpClient;
115110

116111
protected BaseS3Client(
@@ -272,21 +267,17 @@ private String[] handleRedirectResponse(
272267
protected CompletableFuture<Response> executeAsync(Http.S3Request s3request, String region) {
273268
Credentials credentials = (provider == null) ? null : provider.fetch();
274269
Http.Request request = null;
270+
PrintWriter traceStream = this.traceStream;
275271
try {
276-
request = s3request.toRequest(baseUrl, region, credentials);
272+
request = s3request.toRequest(baseUrl, region, credentials, traceStream);
277273
} catch (MinioException e) {
278274
return Utils.failedFuture(e);
279275
}
280276

281277
StringBuilder traceBuilder = new StringBuilder(request.httpTraces());
282-
PrintWriter traceStream = this.traceStream;
283278
if (traceStream != null) traceStream.print(request.httpTraces());
284279

285280
OkHttpClient httpClient = this.httpClient;
286-
// FIXME: enable retry for all request.
287-
// if (!s3request.retryFailure()) {
288-
// httpClient = httpClient.newBuilder().retryOnConnectionFailure(false).build();
289-
// }
290281

291282
okhttp3.Request httpRequest = request.httpRequest();
292283
CompletableFuture<Response> completableFuture = newCompleteableFuture();
@@ -330,14 +321,14 @@ private void onResponse(final Response response) throws IOException {
330321
Set<String> keys = s3request.queryParams().keySet();
331322
if ((s3request.method() != Http.Method.GET
332323
|| s3request.object() == null
333-
|| !Collections.disjoint(keys, TRACE_QUERY_PARAMS))
324+
|| !Collections.disjoint(keys, Http.TRACE_QUERY_PARAMS))
334325
&& !(keys.contains("events")
335326
&& (keys.contains("prefix") || keys.contains("suffix")))) {
336327
String responseBody = response.peekBody(1024 * 1024).string();
337328
traceStream.print(responseBody);
338329
if (!responseBody.endsWith("\n")) traceStream.println();
339330
}
340-
traceStream.println(END_HTTP);
331+
traceStream.println(Http.END_HTTP);
341332
}
342333

343334
completableFuture.complete(response);
@@ -357,8 +348,8 @@ private void onResponse(final Response response) throws IOException {
357348
if (traceStream != null) traceStream.println();
358349
}
359350
}
360-
traceBuilder.append(END_HTTP).append("\n");
361-
if (traceStream != null) traceStream.println(END_HTTP);
351+
traceBuilder.append(Http.END_HTTP).append("\n");
352+
if (traceStream != null) traceStream.println(Http.END_HTTP);
362353

363354
// Error out for Non-XML response from server for non-HEAD requests.
364355
String contentType = response.headers().get(Http.Headers.CONTENT_TYPE);
@@ -635,7 +626,7 @@ protected void checkArgs(BaseArgs args) {
635626
public CompletableFuture<AbortMultipartUploadResponse> abortMultipartUpload(
636627
AbortMultipartUploadArgs args) {
637628
checkArgs(args);
638-
return executeDeleteAsync(args, null, new Http.QueryParameters(UPLOAD_ID, args.uploadId()))
629+
return executeDeleteAsync(args, null, new Http.QueryParameters(Http.UPLOAD_ID, args.uploadId()))
639630
.thenApply(
640631
response -> {
641632
try {
@@ -672,7 +663,7 @@ public CompletableFuture<ObjectWriteResponse> completeMultipartUpload(
672663
return executePostAsync(
673664
args,
674665
args.ssec() == null ? null : args.ssec().headers(),
675-
new Http.QueryParameters(UPLOAD_ID, args.uploadId()),
666+
new Http.QueryParameters(Http.UPLOAD_ID, args.uploadId()),
676667
body)
677668
.thenApply(
678669
response -> {
@@ -1191,7 +1182,7 @@ public CompletableFuture<ListObjectVersionsResponse> listObjectVersions(
11911182
public CompletableFuture<ListPartsResponse> listParts(ListPartsArgs args) {
11921183
Http.QueryParameters queryParams =
11931184
new Http.QueryParameters(
1194-
UPLOAD_ID,
1185+
Http.UPLOAD_ID,
11951186
args.uploadId(),
11961187
"max-parts",
11971188
(args.maxParts() != null) ? args.maxParts().toString() : "1000");

0 commit comments

Comments
 (0)