From 77d04ccb702fb55bcbe8ea0bf9a1caa223653eff Mon Sep 17 00:00:00 2001 From: Jon Chambers Date: Fri, 5 Dec 2025 17:48:45 -0500 Subject: [PATCH] Rename "dynamic rate limiter" to "leaky bucket rate limiter" --- .../limits/BaseRateLimiters.java | 2 +- ...miter.java => LeakyBucketRateLimiter.java} | 17 +++++++++++--- ...t.java => LeakyBucketRateLimiterTest.java} | 22 +++++++++---------- 3 files changed, 26 insertions(+), 15 deletions(-) rename service/src/main/java/org/whispersystems/textsecuregcm/limits/{DynamicRateLimiter.java => LeakyBucketRateLimiter.java} (92%) rename service/src/test/java/org/whispersystems/textsecuregcm/limits/{DynamicRateLimiterTest.java => LeakyBucketRateLimiterTest.java} (93%) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/limits/BaseRateLimiters.java b/service/src/main/java/org/whispersystems/textsecuregcm/limits/BaseRateLimiters.java index 8fd63f682..f94d93037 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/limits/BaseRateLimiters.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/limits/BaseRateLimiters.java @@ -62,6 +62,6 @@ public abstract class BaseRateLimiters { final Clock clock) { final Supplier configResolver = () -> dynamicConfigurationManager.getConfiguration().getLimits().getOrDefault(descriptor.id(), descriptor.defaultConfig()); - return new DynamicRateLimiter(descriptor.id(), configResolver, validateScript, cacheCluster, retryExecutor, clock); + return new LeakyBucketRateLimiter(descriptor.id(), configResolver, validateScript, cacheCluster, retryExecutor, clock); } } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/limits/DynamicRateLimiter.java b/service/src/main/java/org/whispersystems/textsecuregcm/limits/LeakyBucketRateLimiter.java similarity index 92% rename from service/src/main/java/org/whispersystems/textsecuregcm/limits/DynamicRateLimiter.java rename to service/src/main/java/org/whispersystems/textsecuregcm/limits/LeakyBucketRateLimiter.java index 2b54efb97..d3d47f128 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/limits/DynamicRateLimiter.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/limits/LeakyBucketRateLimiter.java @@ -24,7 +24,7 @@ import org.whispersystems.textsecuregcm.util.ResilienceUtil; import org.whispersystems.textsecuregcm.util.ExceptionUtils; import org.whispersystems.textsecuregcm.util.Util; -public class DynamicRateLimiter implements RateLimiter { +public class LeakyBucketRateLimiter implements RateLimiter { private final String name; private final Supplier configResolver; @@ -38,9 +38,20 @@ public class DynamicRateLimiter implements RateLimiter { private final Clock clock; - private static final String RETRY_NAME = ResilienceUtil.name(DynamicRateLimiter.class); + private static final String RETRY_NAME = ResilienceUtil.name(LeakyBucketRateLimiter.class); - public DynamicRateLimiter( + public LeakyBucketRateLimiter( + final String name, + final RateLimiterConfig rateLimiterConfig, + final ClusterLuaScript validateScript, + final FaultTolerantRedisClusterClient cluster, + final ScheduledExecutorService retryExecutor, + final Clock clock) { + + this(name, () -> rateLimiterConfig, validateScript, cluster, retryExecutor, clock); + } + + public LeakyBucketRateLimiter( final String name, final Supplier configResolver, final ClusterLuaScript validateScript, diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/limits/DynamicRateLimiterTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/limits/LeakyBucketRateLimiterTest.java similarity index 93% rename from service/src/test/java/org/whispersystems/textsecuregcm/limits/DynamicRateLimiterTest.java rename to service/src/test/java/org/whispersystems/textsecuregcm/limits/LeakyBucketRateLimiterTest.java index f645d7de0..2e7d37847 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/limits/DynamicRateLimiterTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/limits/LeakyBucketRateLimiterTest.java @@ -36,7 +36,7 @@ import org.whispersystems.textsecuregcm.redis.ClusterLuaScript; import org.whispersystems.textsecuregcm.redis.RedisClusterExtension; import org.whispersystems.textsecuregcm.util.TestClock; -class DynamicRateLimiterTest { +class LeakyBucketRateLimiterTest { private ClusterLuaScript validateRateLimitScript; private ScheduledExecutorService retryExecutor; @@ -62,7 +62,7 @@ class DynamicRateLimiterTest { @ParameterizedTest @ValueSource(booleans = {true, false}) void validate(final boolean failOpen) { - final DynamicRateLimiter rateLimiter = new DynamicRateLimiter( + final LeakyBucketRateLimiter rateLimiter = new LeakyBucketRateLimiter( "test", () -> new RateLimiterConfig(1, Duration.ofHours(1), failOpen), validateRateLimitScript, @@ -79,7 +79,7 @@ class DynamicRateLimiterTest { @ParameterizedTest @ValueSource(booleans = {true, false}) void validateAsync(final boolean failOpen) { - final DynamicRateLimiter rateLimiter = new DynamicRateLimiter( + final LeakyBucketRateLimiter rateLimiter = new LeakyBucketRateLimiter( "test", () -> new RateLimiterConfig(1, Duration.ofHours(1), failOpen), validateRateLimitScript, @@ -102,7 +102,7 @@ class DynamicRateLimiterTest { final ClusterLuaScript failingScript = mock(ClusterLuaScript.class); when(failingScript.execute(any(), any())).thenThrow(new RuntimeException("OH NO")); - final DynamicRateLimiter rateLimiter = new DynamicRateLimiter( + final LeakyBucketRateLimiter rateLimiter = new LeakyBucketRateLimiter( "test", () -> new RateLimiterConfig(1, Duration.ofHours(1), failOpen), failingScript, @@ -125,7 +125,7 @@ class DynamicRateLimiterTest { final ClusterLuaScript failingScript = mock(ClusterLuaScript.class); when(failingScript.executeAsync(any(), any())).thenReturn(CompletableFuture.failedFuture(new RuntimeException("OH NO"))); - final DynamicRateLimiter rateLimiter = new DynamicRateLimiter( + final LeakyBucketRateLimiter rateLimiter = new LeakyBucketRateLimiter( "test", () -> new RateLimiterConfig(1, Duration.ofHours(1), failOpen), failingScript, @@ -148,7 +148,7 @@ class DynamicRateLimiterTest { @Test void configChange_ReduceRefillRate() { final AtomicReference refillRate = new AtomicReference<>(Duration.ofMinutes(5)); - final DynamicRateLimiter rateLimiter = new DynamicRateLimiter( + final LeakyBucketRateLimiter rateLimiter = new LeakyBucketRateLimiter( "test", () -> new RateLimiterConfig(1, refillRate.get(), false), validateRateLimitScript, @@ -172,7 +172,7 @@ class DynamicRateLimiterTest { @Test void configChange_IncreaseRefillRate() { final AtomicReference refillRate = new AtomicReference<>(Duration.ofMinutes(5)); - final DynamicRateLimiter rateLimiter = new DynamicRateLimiter( + final LeakyBucketRateLimiter rateLimiter = new LeakyBucketRateLimiter( "test", () -> new RateLimiterConfig(1, refillRate.get(), false), validateRateLimitScript, @@ -199,7 +199,7 @@ class DynamicRateLimiterTest { @Test void configChange_ReduceBucketSize() { final AtomicInteger bucketSize = new AtomicInteger(5); - final DynamicRateLimiter rateLimiter = new DynamicRateLimiter( + final LeakyBucketRateLimiter rateLimiter = new LeakyBucketRateLimiter( "test", () -> new RateLimiterConfig(bucketSize.get(), Duration.ofMinutes(1), false), validateRateLimitScript, @@ -224,7 +224,7 @@ class DynamicRateLimiterTest { @Test void configChange_IncreaseBucketSize() { final AtomicInteger bucketSize = new AtomicInteger(5); - final DynamicRateLimiter rateLimiter = new DynamicRateLimiter( + final LeakyBucketRateLimiter rateLimiter = new LeakyBucketRateLimiter( "test", () -> new RateLimiterConfig(bucketSize.get(), Duration.ofMinutes(1), false), validateRateLimitScript, @@ -252,7 +252,7 @@ class DynamicRateLimiterTest { when(failingScript.execute(any(), any())).thenThrow(new RuntimeException("OH NO")); final AtomicBoolean failOpen = new AtomicBoolean(false); - final DynamicRateLimiter rateLimiter = new DynamicRateLimiter( + final LeakyBucketRateLimiter rateLimiter = new LeakyBucketRateLimiter( "test", () -> new RateLimiterConfig(1, Duration.ofMinutes(1), failOpen.get()), failingScript, @@ -275,7 +275,7 @@ class DynamicRateLimiterTest { when(failingScript.execute(any(), any())).thenThrow(new RuntimeException("OH NO")); final AtomicBoolean failOpen = new AtomicBoolean(true); - final DynamicRateLimiter rateLimiter = new DynamicRateLimiter( + final LeakyBucketRateLimiter rateLimiter = new LeakyBucketRateLimiter( "test", () -> new RateLimiterConfig(1, Duration.ofMinutes(1), failOpen.get()), failingScript,