1
15
16 package software.amazon.awssdk.core.internal.retry;
17
18 import java.time.Duration;
19 import java.time.Instant;
20 import software.amazon.awssdk.annotations.SdkInternalApi;
21 import software.amazon.awssdk.annotations.ThreadSafe;
22 import software.amazon.awssdk.core.exception.SdkException;
23 import software.amazon.awssdk.core.internal.http.HttpClientDependencies;
24 import software.amazon.awssdk.core.retry.ClockSkew;
25 import software.amazon.awssdk.core.retry.RetryUtils;
26 import software.amazon.awssdk.http.SdkHttpResponse;
27 import software.amazon.awssdk.utils.Logger;
28
29
32 @ThreadSafe
33 @SdkInternalApi
34 public final class ClockSkewAdjuster {
35 private static final Logger log = Logger.loggerFor(ClockSkewAdjuster.class);
36
37
40 public boolean shouldAdjust(SdkException exception) {
41 return RetryUtils.isClockSkewException(exception);
42 }
43
44
49 public Integer getAdjustmentInSeconds(SdkHttpResponse response) {
50 Instant now = Instant.now();
51 Instant serverTime = ClockSkew.getServerTime(response).orElse(null);
52 Duration skew = ClockSkew.getClockSkew(now, serverTime);
53 try {
54 return Math.toIntExact(skew.getSeconds());
55 } catch (ArithmeticException e) {
56 log.warn(() -> "The clock skew between the client and server was too large to be compensated for (" + now +
57 " versus " + serverTime + ").");
58 return 0;
59 }
60 }
61 }