Skip to content

Commit c0a4941

Browse files
GH-464: Fix backOff API in UniformRandomBackOffPolicy
Fixes: #464 Issue link: #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
1 parent db47bc6 commit c0a4941

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

src/main/java/org/springframework/retry/backoff/UniformRandomBackOffPolicy.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,8 @@ public long getMaxBackOffPeriod() {
134134
protected void doBackOff() throws BackOffInterruptedException {
135135
try {
136136
Long min = this.minBackOffPeriod.get();
137-
long delta = this.maxBackOffPeriod.get() == this.minBackOffPeriod.get() ? 0
138-
: this.random.nextInt((int) (this.maxBackOffPeriod.get() - min));
137+
Long max = this.maxBackOffPeriod.get();
138+
long delta = max <= min ? 0 : this.random.nextInt((int) (max - min));
139139
this.sleeper.sleep(min + delta);
140140
}
141141
catch (InterruptedException e) {

src/test/java/org/springframework/retry/backoff/UniformRandomBackOffPolicyTests.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,18 @@ public void testSetSleeper() {
3636
int maxBackOff = 10000;
3737
backOffPolicy.setMinBackOffPeriod(minBackOff);
3838
backOffPolicy.setMaxBackOffPeriod(maxBackOff);
39-
UniformRandomBackOffPolicy withSleeper = backOffPolicy.withSleeper(new DummySleeper());
39+
40+
DummySleeper dummySleeper = new DummySleeper();
41+
UniformRandomBackOffPolicy withSleeper = backOffPolicy.withSleeper(dummySleeper);
4042

4143
assertThat(withSleeper.getMinBackOffPeriod()).isEqualTo(minBackOff);
4244
assertThat(withSleeper.getMaxBackOffPeriod()).isEqualTo(maxBackOff);
45+
46+
assertThat(dummySleeper.getBackOffs()).isEmpty();
47+
withSleeper.backOff(null);
48+
49+
assertThat(dummySleeper.getBackOffs()).hasSize(1);
50+
assertThat(dummySleeper.getBackOffs()[0]).isLessThan(maxBackOff);
4351
}
4452

4553
@Test
@@ -60,4 +68,20 @@ public void sleep(long backOffPeriod) throws InterruptedException {
6068
assertThat(Thread.interrupted()).isTrue();
6169
}
6270

71+
@Test
72+
public void testMaxBackOffLessThanMinBackOff() {
73+
UniformRandomBackOffPolicy backOffPolicy = new UniformRandomBackOffPolicy();
74+
int minBackOff = 1000;
75+
int maxBackOff = 10;
76+
backOffPolicy.setMinBackOffPeriod(minBackOff);
77+
backOffPolicy.setMaxBackOffPeriod(maxBackOff);
78+
79+
DummySleeper dummySleeper = new DummySleeper();
80+
UniformRandomBackOffPolicy withSleeper = backOffPolicy.withSleeper(dummySleeper);
81+
assertThat(dummySleeper.getBackOffs()).isEmpty();
82+
withSleeper.backOff(null);
83+
assertThat(dummySleeper.getBackOffs()).hasSize(1);
84+
assertThat(dummySleeper.getBackOffs()[0]).isEqualTo(minBackOff);
85+
}
86+
6387
}

0 commit comments

Comments
 (0)