blob: b1a66c99842f3dc6cca471ce8c7da65ac541138d [file] [log] [blame]
package org.apache.helix.util;
import java.util.Random;
public class ExponentialBackoffStrategy {
private final long INIT_RETRY_INTERVAL = 500;
private final long _maxRetryInterval;
private final boolean _addJitter;
private final Random _ran;
public ExponentialBackoffStrategy(long maxRetryInterval, boolean addJitter) {
_maxRetryInterval = maxRetryInterval;
_addJitter = addJitter;
_ran = new Random(System.currentTimeMillis());
}
public long getNextWaitInterval(int numberOfTriesFailed) {
double exponentialMultiplier = Math.pow(2.0, numberOfTriesFailed - 1);
double result = exponentialMultiplier * INIT_RETRY_INTERVAL;
if (_maxRetryInterval > 0 && result > _maxRetryInterval) {
result = _maxRetryInterval;
}
if (_addJitter) {
// Adding jitter so the real result would be 75% to 100% of the original result.
// Don't directly add jitter here, since it may exceed the max retry interval setup
result = result * (0.75 + _ran.nextDouble() % 0.25);
}
return (long) result;
}
}