[NO ISSUE]: Avoid potential overflows
- user model changes: no
- storage format changes: no
- interface changes: no
details:
- delay might overflow if maxRetries > 50
Change-Id: Icdc500f49ac9b90e169182930489ec6c5fee7552
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19378
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Ritik Raj <raj.ritik9835@gmail.com>
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ExponentialRetryPolicy.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ExponentialRetryPolicy.java
index a5255ab..b332a2d 100644
--- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ExponentialRetryPolicy.java
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ExponentialRetryPolicy.java
@@ -25,11 +25,11 @@
private static final int DEFAULT_MAX_RETRIES = 10;
private static final long DEFAULT_INITIAL_DELAY_IN_MILLIS = 100;
- private static final long DEFAULT_MAX_DELAY_IN_MILLIS = Long.MAX_VALUE;
+ private static final long DEFAULT_MAX_DELAY_IN_MILLIS = Long.MAX_VALUE - 1;
private final int maxRetries;
- private final long initialDelay;
private final long maxDelay;
private int attempt = 0;
+ private long delay;
/**
* Default constructor for ExponentialRetryPolicy.
@@ -48,8 +48,8 @@
*/
public ExponentialRetryPolicy(int maxRetries, long initialDelay, long maxDelay) {
this.maxRetries = maxRetries;
- this.initialDelay = initialDelay;
- this.maxDelay = maxDelay;
+ this.maxDelay = Long.min(maxDelay, DEFAULT_MAX_DELAY_IN_MILLIS);
+ this.delay = Long.min(initialDelay, this.maxDelay);
}
/**
@@ -77,12 +77,12 @@
public boolean retry(Throwable failure) {
if (attempt < maxRetries) {
try {
- long delay = initialDelay * (1L << attempt);
- TimeUnit.MILLISECONDS.sleep(ThreadLocalRandom.current().nextLong(1 + Long.min(delay, maxDelay)));
+ TimeUnit.MILLISECONDS.sleep(ThreadLocalRandom.current().nextLong(1 + delay));
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
attempt++;
+ delay = delay > maxDelay / 2 ? maxDelay : delay * 2;
return true;
}
return false;