Support sub-millisecond permit regeneration durations in rate limiters
This commit is contained in:
parent
82ed783a2d
commit
e38a713ccc
|
@ -11,11 +11,16 @@ import java.time.Duration;
|
||||||
public record RateLimiterConfig(int bucketSize, Duration permitRegenerationDuration) {
|
public record RateLimiterConfig(int bucketSize, Duration permitRegenerationDuration) {
|
||||||
|
|
||||||
public double leakRatePerMillis() {
|
public double leakRatePerMillis() {
|
||||||
return 1.0 / permitRegenerationDuration.toMillis();
|
return 1.0 / (permitRegenerationDuration.toNanos() / 1e6);
|
||||||
}
|
}
|
||||||
|
|
||||||
@AssertTrue
|
@AssertTrue
|
||||||
public boolean hasPositiveRegenerationRate() {
|
public boolean hasPositiveRegenerationRate() {
|
||||||
return permitRegenerationDuration.toMillis() > 0;
|
try {
|
||||||
|
return permitRegenerationDuration.toNanos() > 0;
|
||||||
|
} catch (final ArithmeticException e) {
|
||||||
|
// The duration was too large to fit in a long, so it's definitely positive
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -302,7 +302,7 @@ class DynamicConfigurationTest {
|
||||||
limits:
|
limits:
|
||||||
rateLimitReset:
|
rateLimitReset:
|
||||||
bucketSize: 17
|
bucketSize: 17
|
||||||
permitRegenerationDuration: PT4S
|
permitRegenerationDuration: PT0.000004S
|
||||||
""");
|
""");
|
||||||
|
|
||||||
final RateLimiterConfig resetRateLimiterConfig =
|
final RateLimiterConfig resetRateLimiterConfig =
|
||||||
|
@ -310,7 +310,7 @@ class DynamicConfigurationTest {
|
||||||
.getLimits().get(RateLimiters.For.RATE_LIMIT_RESET.id());
|
.getLimits().get(RateLimiters.For.RATE_LIMIT_RESET.id());
|
||||||
|
|
||||||
assertThat(resetRateLimiterConfig.bucketSize()).isEqualTo(17);
|
assertThat(resetRateLimiterConfig.bucketSize()).isEqualTo(17);
|
||||||
assertThat(resetRateLimiterConfig.permitRegenerationDuration()).isEqualTo(Duration.ofSeconds(4));
|
assertThat(resetRateLimiterConfig.permitRegenerationDuration()).isEqualTo(Duration.ofNanos(4_000));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -17,11 +17,13 @@ class RateLimiterConfigTest {
|
||||||
@Test
|
@Test
|
||||||
void leakRatePerMillis() {
|
void leakRatePerMillis() {
|
||||||
assertEquals(0.001, new RateLimiterConfig(1, Duration.ofSeconds(1)).leakRatePerMillis());
|
assertEquals(0.001, new RateLimiterConfig(1, Duration.ofSeconds(1)).leakRatePerMillis());
|
||||||
|
assertEquals(1e6, new RateLimiterConfig(1, Duration.ofNanos(1)).leakRatePerMillis());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void isRegenerationRatePositive() {
|
void isRegenerationRatePositive() {
|
||||||
assertTrue(new RateLimiterConfig(1, Duration.ofSeconds(1)).hasPositiveRegenerationRate());
|
assertTrue(new RateLimiterConfig(1, Duration.ofSeconds(1)).hasPositiveRegenerationRate());
|
||||||
|
assertTrue(new RateLimiterConfig(1, Duration.ofNanos(1)).hasPositiveRegenerationRate());
|
||||||
assertFalse(new RateLimiterConfig(1, Duration.ZERO).hasPositiveRegenerationRate());
|
assertFalse(new RateLimiterConfig(1, Duration.ZERO).hasPositiveRegenerationRate());
|
||||||
assertFalse(new RateLimiterConfig(1, Duration.ofSeconds(-1)).hasPositiveRegenerationRate());
|
assertFalse(new RateLimiterConfig(1, Duration.ofSeconds(-1)).hasPositiveRegenerationRate());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue