Skip to content

Commit 60eb44d

Browse files
Change default exponential backoff sequence to not start with zero
Recovery delay was a connection recovery feature from day 1 for a reason: * In practice connection recovery often won't succeed the first time because network failures don't always go away in milliseconds. * There's a natural race condition between server state changes (cleanup of queues and such) and the operations a recovered connection will perform potentially on entities *with the same identifier* (e.g. name) Initial delay avoids a lot of scenarios that stem from the above race condition and can waste a lot of time for operators, developers and the RabbitMQ core team. References #307.
1 parent 1bc7248 commit 60eb44d

File tree

2 files changed

+20
-19
lines changed

2 files changed

+20
-19
lines changed

src/main/java/com/rabbitmq/client/RecoveryDelayHandler.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,10 @@ class ExponentialBackoffDelayHandler implements RecoveryDelayHandler {
6767
private final List<Long> sequence;
6868

6969
/**
70-
* Default Constructor. Uses the fibonacci sequence: {0, 1000, 1000, 2000, 3000, 5000, 8000, 13000, 21000}.
70+
* Default Constructor. Uses the following sequence: 2000, 3000, 5000, 8000, 13000, 21000, 34000
7171
*/
7272
public ExponentialBackoffDelayHandler() {
73-
sequence = Arrays.asList(0L, 1000L, 1000L, 2000L, 3000L, 5000L, 8000L, 13000L, 21000L);
73+
sequence = Arrays.asList(2000L, 3000L, 5000L, 8000L, 13000L, 21000L, 34000L);
7474
}
7575

7676
/**
@@ -88,7 +88,8 @@ public ExponentialBackoffDelayHandler(final List<Long> sequence) {
8888

8989
@Override
9090
public long getDelay(int recoveryAttempts) {
91-
return sequence.get(recoveryAttempts >= sequence.size() ? sequence.size() - 1 : recoveryAttempts);
91+
int index = recoveryAttempts >= sequence.size() ? sequence.size() - 1 : recoveryAttempts;
92+
return sequence.get(index);
9293
}
9394
}
94-
}
95+
}

src/test/java/com/rabbitmq/client/test/RecoveryDelayHandlerTest.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,23 +37,23 @@ public void testDefaultRecoveryDelayHandler() {
3737
}
3838

3939
@Test
40-
public void testExponentialBackoffDelayHandler_default() {
40+
public void testExponentialBackoffDelayHandlerDefaults() {
4141
final RecoveryDelayHandler handler = new ExponentialBackoffDelayHandler();
42-
assertEquals(0, handler.getDelay(0));
43-
assertEquals(1000L, handler.getDelay(1));
44-
assertEquals(1000L, handler.getDelay(2));
45-
assertEquals(2000L, handler.getDelay(3));
46-
assertEquals(3000L, handler.getDelay(4));
47-
assertEquals(5000L, handler.getDelay(5));
48-
assertEquals(8000L, handler.getDelay(6));
49-
assertEquals(13000L, handler.getDelay(7));
50-
assertEquals(21000L, handler.getDelay(8));
51-
assertEquals(21000L, handler.getDelay(9));
52-
assertEquals(21000L, handler.getDelay(Integer.MAX_VALUE));
42+
assertEquals(2000L, handler.getDelay(0));
43+
assertEquals(3000L, handler.getDelay(1));
44+
assertEquals(5000L, handler.getDelay(2));
45+
assertEquals(8000L, handler.getDelay(3));
46+
assertEquals(13000L, handler.getDelay(4));
47+
assertEquals(21000L, handler.getDelay(5));
48+
assertEquals(34000L, handler.getDelay(6));
49+
assertEquals(34000L, handler.getDelay(7));
50+
assertEquals(34000L, handler.getDelay(8));
51+
assertEquals(34000L, handler.getDelay(9));
52+
assertEquals(34000L, handler.getDelay(Integer.MAX_VALUE));
5353
}
5454

5555
@Test
56-
public void testExponentialBackoffDelayHandler_sequence() {
56+
public void testExponentialBackoffDelayHandlerSequence() {
5757
final RecoveryDelayHandler handler = new ExponentialBackoffDelayHandler(Arrays.asList(1L, 2L));
5858
assertEquals(1, handler.getDelay(0));
5959
assertEquals(2, handler.getDelay(1));
@@ -62,12 +62,12 @@ public void testExponentialBackoffDelayHandler_sequence() {
6262
}
6363

6464
@Test(expected=IllegalArgumentException.class)
65-
public void testExponentialBackoffDelayHandler_sequence_null() {
65+
public void testExponentialBackoffDelayHandlerWithNullSequence() {
6666
new ExponentialBackoffDelayHandler(null);
6767
}
6868

6969
@Test(expected=IllegalArgumentException.class)
70-
public void testExponentialBackoffDelayHandler_sequence_empty() {
70+
public void testExponentialBackoffDelayHandlerWithEmptySequence() {
7171
new ExponentialBackoffDelayHandler(Collections.<Long>emptyList());
7272
}
7373
}

0 commit comments

Comments
 (0)