diff --git a/resilience4j-ratelimiter/src/main/java/io/github/resilience4j/ratelimiter/internal/SemaphoreBasedRateLimiter.java b/resilience4j-ratelimiter/src/main/java/io/github/resilience4j/ratelimiter/internal/SemaphoreBasedRateLimiter.java index 9a1f402a13..06b410c7ac 100644 --- a/resilience4j-ratelimiter/src/main/java/io/github/resilience4j/ratelimiter/internal/SemaphoreBasedRateLimiter.java +++ b/resilience4j-ratelimiter/src/main/java/io/github/resilience4j/ratelimiter/internal/SemaphoreBasedRateLimiter.java @@ -105,7 +105,8 @@ private void scheduleLimitRefresh() { } void refreshLimit() { - semaphore.release(this.rateLimiterConfig.getLimitForPeriod()); + int permissionsToRelease = this.rateLimiterConfig.getLimitForPeriod() - semaphore.availablePermits(); + semaphore.release(permissionsToRelease); } /** diff --git a/resilience4j-ratelimiter/src/test/java/io/github/resilience4j/ratelimiter/internal/SemaphoreBasedRateLimiterImplTest.java b/resilience4j-ratelimiter/src/test/java/io/github/resilience4j/ratelimiter/internal/SemaphoreBasedRateLimiterImplTest.java index d9f149967a..bb050c95b9 100644 --- a/resilience4j-ratelimiter/src/test/java/io/github/resilience4j/ratelimiter/internal/SemaphoreBasedRateLimiterImplTest.java +++ b/resilience4j-ratelimiter/src/test/java/io/github/resilience4j/ratelimiter/internal/SemaphoreBasedRateLimiterImplTest.java @@ -215,6 +215,16 @@ public void getRateLimiterConfig() throws Exception { then(limit.getRateLimiterConfig()).isEqualTo(config); } + @Test + public void isUpperLimitedForPermissions() throws Exception { + ScheduledExecutorService scheduler = mock(ScheduledExecutorService.class); + SemaphoreBasedRateLimiter limit = new SemaphoreBasedRateLimiter("test", config, scheduler); + RateLimiter.Metrics metrics = limit.getMetrics(); + then(metrics.getAvailablePermissions()).isEqualTo(2); + limit.refreshLimit(); + then(metrics.getAvailablePermissions()).isEqualTo(2); + } + @Test public void getDetailedMetrics() throws Exception { ScheduledExecutorService scheduler = mock(ScheduledExecutorService.class);