From 9d8d841d787f5b5c59ef914b9b2498386a2f95ea Mon Sep 17 00:00:00 2001 From: bstorozhuk Date: Fri, 24 Mar 2017 12:58:40 +0200 Subject: [PATCH] Issue #63 upper limit for SemaphoreBasedRateLimiter --- .../internal/SemaphoreBasedRateLimiter.java | 3 ++- .../internal/SemaphoreBasedRateLimiterImplTest.java | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) 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);