Skip to content

Commit cf75d7e

Browse files
committed
Creating RetryPeriodicDelay
1 parent cc57339 commit cf75d7e

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package io.opentelemetry.opamp.client.internal.request.delay;
2+
3+
import java.time.Duration;
4+
import java.util.Objects;
5+
import java.util.concurrent.atomic.AtomicReference;
6+
7+
/** Defaults to an exponential backoff strategy, unless a delay is suggested. */
8+
public final class RetryPeriodicDelay implements PeriodicDelay, AcceptsDelaySuggestion {
9+
private final ExponentialBackoffPeriodicDelay exponentialBackoff;
10+
private final AtomicReference<PeriodicDelay> currentDelay;
11+
12+
public static RetryPeriodicDelay create(Duration initialDelay) {
13+
return new RetryPeriodicDelay(new ExponentialBackoffPeriodicDelay(initialDelay));
14+
}
15+
16+
private RetryPeriodicDelay(ExponentialBackoffPeriodicDelay exponentialBackoff) {
17+
this.exponentialBackoff = exponentialBackoff;
18+
currentDelay = new AtomicReference<>(exponentialBackoff);
19+
}
20+
21+
@Override
22+
public void suggestDelay(Duration delay) {
23+
currentDelay.set(PeriodicDelay.ofFixedDuration(delay));
24+
}
25+
26+
@Override
27+
public Duration getNextDelay() {
28+
return Objects.requireNonNull(currentDelay.get()).getNextDelay();
29+
}
30+
31+
@Override
32+
public void reset() {
33+
exponentialBackoff.reset();
34+
currentDelay.set(exponentialBackoff);
35+
}
36+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package io.opentelemetry.opamp.client.internal.request.delay;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.time.Duration;
6+
import org.junit.jupiter.api.Test;
7+
8+
class RetryPeriodicDelayTest {
9+
@Test
10+
public void verifyDelayBehavior() {
11+
RetryPeriodicDelay retryPeriodicDelay = RetryPeriodicDelay.create(Duration.ofSeconds(1));
12+
13+
// Without suggested delay
14+
assertThat(retryPeriodicDelay.getNextDelay()).isEqualTo(Duration.ofSeconds(1));
15+
assertThat(retryPeriodicDelay.getNextDelay()).isEqualTo(Duration.ofSeconds(2));
16+
assertThat(retryPeriodicDelay.getNextDelay()).isEqualTo(Duration.ofSeconds(4));
17+
retryPeriodicDelay.reset();
18+
assertThat(retryPeriodicDelay.getNextDelay()).isEqualTo(Duration.ofSeconds(1));
19+
20+
// With suggested delay
21+
retryPeriodicDelay.suggestDelay(Duration.ofSeconds(5));
22+
assertThat(retryPeriodicDelay.getNextDelay()).isEqualTo(Duration.ofSeconds(5));
23+
retryPeriodicDelay.reset();
24+
assertThat(retryPeriodicDelay.getNextDelay()).isEqualTo(Duration.ofSeconds(1));
25+
}
26+
}

0 commit comments

Comments
 (0)