Skip to content

Commit be2aba0

Browse files
authored
fix: update Default RetryStrategy to retry SSLException caused by SocketException (#1900)
Update Default RetryStrategy to retry when an SSLException is caused by a SocketException
1 parent 7b597af commit be2aba0

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

google-cloud-storage/src/main/java/com/google/cloud/storage/DefaultStorageRetryStrategy.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
import com.google.common.collect.ImmutableSet;
2525
import com.google.gson.stream.MalformedJsonException;
2626
import java.io.IOException;
27+
import java.net.SocketException;
2728
import java.util.Set;
29+
import javax.net.ssl.SSLException;
2830

2931
final class DefaultStorageRetryStrategy implements StorageRetryStrategy {
3032

@@ -102,7 +104,14 @@ private RetryResult shouldRetryIOException(IOException ioException) {
102104
return RetryResult.RETRY;
103105
} else if (ioException instanceof MalformedJsonException && idempotent) { // Gson
104106
return RetryResult.RETRY;
105-
} else if (BaseServiceException.isRetryable(idempotent, ioException)) {
107+
} else if (ioException instanceof SSLException && idempotent) {
108+
Throwable cause = ioException.getCause();
109+
if (cause instanceof SocketException) {
110+
SocketException se = (SocketException) cause;
111+
return shouldRetryIOException(se);
112+
}
113+
}
114+
if (BaseServiceException.isRetryable(idempotent, ioException)) {
106115
return RetryResult.RETRY;
107116
} else {
108117
return RetryResult.NO_RETRY;

google-cloud-storage/src/test/java/com/google/cloud/storage/DefaultRetryHandlingBehaviorTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ enum ThrowableCategory {
268268
SOCKET_EXCEPTION(C.SOCKET_EXCEPTION),
269269
SSL_EXCEPTION(C.SSL_EXCEPTION),
270270
SSL_EXCEPTION_CONNECTION_SHUTDOWN(C.SSL_EXCEPTION_CONNECTION_SHUTDOWN),
271+
SSL_EXCEPTION_CONNECTION_RESET(C.SSL_EXCEPTION_CONNECTION_RESET),
271272
SSL_HANDSHAKE_EXCEPTION(C.SSL_HANDSHAKE_EXCEPTION),
272273
SSL_HANDSHAKE_EXCEPTION_CAUSED_BY_CERTIFICATE_EXCEPTION(
273274
C.SSL_HANDSHAKE_EXCEPTION_CERTIFICATE_EXCEPTION),
@@ -305,6 +306,8 @@ enum ThrowableCategory {
305306
STORAGE_EXCEPTION_SSL_EXCEPTION(new StorageException(C.SSL_EXCEPTION)),
306307
STORAGE_EXCEPTION_SSL_EXCEPTION_CONNECTION_SHUTDOWN(
307308
new StorageException(C.SSL_EXCEPTION_CONNECTION_SHUTDOWN)),
309+
STORAGE_EXCEPTION_SSL_EXCEPTION_CONNECTION_RESET(
310+
new StorageException(C.SSL_EXCEPTION_CONNECTION_RESET)),
308311
STORAGE_EXCEPTION_SSL_HANDSHAKE_EXCEPTION(new StorageException(C.SSL_HANDSHAKE_EXCEPTION)),
309312
STORAGE_EXCEPTION_SSL_HANDSHAKE_EXCEPTION_CAUSED_BY_CERTIFICATE_EXCEPTION(
310313
new StorageException(C.SSL_HANDSHAKE_EXCEPTION_CERTIFICATE_EXCEPTION)),
@@ -361,6 +364,8 @@ private static final class C {
361364
private static final SSLException SSL_EXCEPTION = new SSLException("unknown");
362365
private static final SSLException SSL_EXCEPTION_CONNECTION_SHUTDOWN =
363366
new SSLException("Connection has been shutdown: asdf");
367+
private static final SSLException SSL_EXCEPTION_CONNECTION_RESET =
368+
new SSLException("Connection reset", new SocketException("Connection reset"));
364369
private static final SSLHandshakeException SSL_HANDSHAKE_EXCEPTION =
365370
newSslHandshakeExceptionWithCause(new SSLProtocolException(DEFAULT_MESSAGE));
366371
private static final SSLHandshakeException SSL_HANDSHAKE_EXCEPTION_CERTIFICATE_EXCEPTION =
@@ -614,6 +619,16 @@ private static ImmutableList<Case> getAllCases() {
614619
HandlerCategory.NONIDEMPOTENT,
615620
ExpectRetry.NO,
616621
Behavior.SAME),
622+
new Case(
623+
ThrowableCategory.SSL_EXCEPTION_CONNECTION_RESET,
624+
HandlerCategory.IDEMPOTENT,
625+
ExpectRetry.YES,
626+
Behavior.DEFAULT_MORE_PERMISSIBLE),
627+
new Case(
628+
ThrowableCategory.SSL_EXCEPTION_CONNECTION_RESET,
629+
HandlerCategory.NONIDEMPOTENT,
630+
ExpectRetry.NO,
631+
Behavior.SAME),
617632
new Case(
618633
ThrowableCategory.SSL_HANDSHAKE_EXCEPTION,
619634
HandlerCategory.IDEMPOTENT,
@@ -884,6 +899,16 @@ private static ImmutableList<Case> getAllCases() {
884899
HandlerCategory.NONIDEMPOTENT,
885900
ExpectRetry.NO,
886901
Behavior.DEFAULT_MORE_STRICT),
902+
new Case(
903+
ThrowableCategory.STORAGE_EXCEPTION_SSL_EXCEPTION_CONNECTION_RESET,
904+
HandlerCategory.IDEMPOTENT,
905+
ExpectRetry.YES,
906+
Behavior.DEFAULT_MORE_PERMISSIBLE),
907+
new Case(
908+
ThrowableCategory.STORAGE_EXCEPTION_SSL_EXCEPTION_CONNECTION_RESET,
909+
HandlerCategory.NONIDEMPOTENT,
910+
ExpectRetry.NO,
911+
Behavior.SAME),
887912
new Case(
888913
ThrowableCategory.STORAGE_EXCEPTION_SSL_HANDSHAKE_EXCEPTION,
889914
HandlerCategory.IDEMPOTENT,

0 commit comments

Comments
 (0)