GH-464: Fix backOff API in UniformRandomBackOffPolicy

Fixes: #464
Issue link: https://github.com/spring-projects/spring-retry/issues/464

When `maxBackOffPeriod` is less than `minBackOffPeriod`, delta is taken
taken as zero in `UniformRandomBackOffPolicy` `backOff()` method.

* Update tests to use `DummySleeper`
* Extract `UniformRandomBackOffPolicy` `backOffSuppliers` into local variables
* Modify `UniformRandomBackOffPolicy` tests
This commit is contained in:
LokeshAlamuri
2024-09-09 19:30:03 +05:30
committed by GitHub
parent db47bc66fd
commit c0a49411c2
2 changed files with 27 additions and 3 deletions

View File

@@ -134,8 +134,8 @@ public class UniformRandomBackOffPolicy extends StatelessBackOffPolicy
protected void doBackOff() throws BackOffInterruptedException {
try {
Long min = this.minBackOffPeriod.get();
long delta = this.maxBackOffPeriod.get() == this.minBackOffPeriod.get() ? 0
: this.random.nextInt((int) (this.maxBackOffPeriod.get() - min));
Long max = this.maxBackOffPeriod.get();
long delta = max <= min ? 0 : this.random.nextInt((int) (max - min));
this.sleeper.sleep(min + delta);
}
catch (InterruptedException e) {

View File

@@ -36,10 +36,18 @@ public class UniformRandomBackOffPolicyTests {
int maxBackOff = 10000;
backOffPolicy.setMinBackOffPeriod(minBackOff);
backOffPolicy.setMaxBackOffPeriod(maxBackOff);
UniformRandomBackOffPolicy withSleeper = backOffPolicy.withSleeper(new DummySleeper());
DummySleeper dummySleeper = new DummySleeper();
UniformRandomBackOffPolicy withSleeper = backOffPolicy.withSleeper(dummySleeper);
assertThat(withSleeper.getMinBackOffPeriod()).isEqualTo(minBackOff);
assertThat(withSleeper.getMaxBackOffPeriod()).isEqualTo(maxBackOff);
assertThat(dummySleeper.getBackOffs()).isEmpty();
withSleeper.backOff(null);
assertThat(dummySleeper.getBackOffs()).hasSize(1);
assertThat(dummySleeper.getBackOffs()[0]).isLessThan(maxBackOff);
}
@Test
@@ -60,4 +68,20 @@ public class UniformRandomBackOffPolicyTests {
assertThat(Thread.interrupted()).isTrue();
}
@Test
public void testMaxBackOffLessThanMinBackOff() {
UniformRandomBackOffPolicy backOffPolicy = new UniformRandomBackOffPolicy();
int minBackOff = 1000;
int maxBackOff = 10;
backOffPolicy.setMinBackOffPeriod(minBackOff);
backOffPolicy.setMaxBackOffPeriod(maxBackOff);
DummySleeper dummySleeper = new DummySleeper();
UniformRandomBackOffPolicy withSleeper = backOffPolicy.withSleeper(dummySleeper);
assertThat(dummySleeper.getBackOffs()).isEmpty();
withSleeper.backOff(null);
assertThat(dummySleeper.getBackOffs()).hasSize(1);
assertThat(dummySleeper.getBackOffs()[0]).isEqualTo(minBackOff);
}
}