1
15 package com.amazonaws.retry;
16
17 import com.amazonaws.AmazonClientException;
18 import com.amazonaws.AmazonWebServiceRequest;
19 import com.amazonaws.ClientConfiguration;
20 import com.amazonaws.annotation.SdkInternalApi;
21 import com.amazonaws.retry.internal.MaxAttemptsResolver;
22 import com.amazonaws.retry.v2.RetryPolicyContext;
23
24 import static com.amazonaws.retry.PredefinedRetryPolicies.DEFAULT_MAX_ERROR_RETRY_STANDARD_MODE;
25 import static com.amazonaws.util.ValidationUtils.assertNotNull;
26
27
31 @SdkInternalApi
32 public class RetryPolicyAdapter implements com.amazonaws.retry.v2.RetryPolicy {
33 private final RetryPolicy legacyRetryPolicy;
34 private final ClientConfiguration clientConfiguration;
35 private final int maxErrorRetry;
36
37 public RetryPolicyAdapter(RetryPolicy legacyRetryPolicy, ClientConfiguration clientConfiguration) {
38 this.legacyRetryPolicy = assertNotNull(legacyRetryPolicy, "legacyRetryPolicy");
39 this.clientConfiguration = assertNotNull(clientConfiguration, "clientConfiguration");
40 this.maxErrorRetry = resolveMaxErrorRetry();
41 }
42
43 @Override
44 public long computeDelayBeforeNextRetry(RetryPolicyContext context) {
45 return legacyRetryPolicy.getBackoffStrategy().delayBeforeNextRetry(
46 (AmazonWebServiceRequest) context.originalRequest(),
47 (AmazonClientException) context.exception(),
48 context.retriesAttempted());
49 }
50
51 @Override
52 public boolean shouldRetry(RetryPolicyContext context) {
53 return !maxRetriesExceeded(context) && isRetryable(context);
54 }
55
56 public boolean isRetryable(RetryPolicyContext context) {
57 return legacyRetryPolicy.getRetryCondition().shouldRetry(
58 (AmazonWebServiceRequest) context.originalRequest(),
59 (AmazonClientException) context.exception(),
60 context.retriesAttempted());
61 }
62
63 public RetryPolicy getLegacyRetryPolicy() {
64 return this.legacyRetryPolicy;
65 }
66
67 private int resolveMaxErrorRetry() {
68 if(legacyRetryPolicy.isMaxErrorRetryInClientConfigHonored() && clientConfiguration.getMaxErrorRetry() >= 0) {
69 return clientConfiguration.getMaxErrorRetry();
70 }
71
72 Integer resolvedMaxAttempts = new MaxAttemptsResolver().maxAttempts();
73
74 if (resolvedMaxAttempts != null) {
75 return resolvedMaxAttempts - 1;
76 }
77
78 if (shouldUseStandardModeDefaultMaxRetry()) {
79 return DEFAULT_MAX_ERROR_RETRY_STANDARD_MODE;
80 }
81
82
83 return legacyRetryPolicy.getMaxErrorRetry();
84 }
85
86
90 private boolean shouldUseStandardModeDefaultMaxRetry() {
91 RetryMode retryMode = clientConfiguration.getRetryMode() == null ? legacyRetryPolicy.getRetryMode()
92 : clientConfiguration.getRetryMode();
93
94 return retryMode.equals(RetryMode.STANDARD) && legacyRetryPolicy.isDefaultMaxErrorRetryInRetryModeHonored();
95 }
96
97 public boolean maxRetriesExceeded(RetryPolicyContext context) {
98 return context.retriesAttempted() >= maxErrorRetry;
99 }
100
101 public int getMaxErrorRetry() {
102 return maxErrorRetry;
103 }
104 }
105