Allows 0 burstCapacity.
Fixes gh-1312
This commit is contained in:
@@ -282,22 +282,26 @@ public class RedisRateLimiter extends AbstractRateLimiter<RedisRateLimiter.Confi
|
||||
Flux<List<Long>> flux = this.redisTemplate.execute(this.script, keys,
|
||||
scriptArgs);
|
||||
// .log("redisratelimiter", Level.FINER);
|
||||
return flux.onErrorResume(throwable -> Flux.just(Arrays.asList(1L, -1L)))
|
||||
.reduce(new ArrayList<Long>(), (longs, l) -> {
|
||||
longs.addAll(l);
|
||||
return longs;
|
||||
}).map(results -> {
|
||||
boolean allowed = results.get(0) == 1L;
|
||||
Long tokensLeft = results.get(1);
|
||||
return flux.onErrorResume(throwable -> {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Error calling rate limiter lua", throwable);
|
||||
}
|
||||
return Flux.just(Arrays.asList(1L, -1L));
|
||||
}).reduce(new ArrayList<Long>(), (longs, l) -> {
|
||||
longs.addAll(l);
|
||||
return longs;
|
||||
}).map(results -> {
|
||||
boolean allowed = results.get(0) == 1L;
|
||||
Long tokensLeft = results.get(1);
|
||||
|
||||
Response response = new Response(allowed,
|
||||
getHeaders(routeConfig, tokensLeft));
|
||||
Response response = new Response(allowed,
|
||||
getHeaders(routeConfig, tokensLeft));
|
||||
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("response: " + response);
|
||||
}
|
||||
return response;
|
||||
});
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("response: " + response);
|
||||
}
|
||||
return response;
|
||||
});
|
||||
}
|
||||
catch (Exception e) {
|
||||
/*
|
||||
@@ -345,7 +349,7 @@ public class RedisRateLimiter extends AbstractRateLimiter<RedisRateLimiter.Confi
|
||||
@Min(1)
|
||||
private int replenishRate;
|
||||
|
||||
@Min(1)
|
||||
@Min(0)
|
||||
private int burstCapacity = 1;
|
||||
|
||||
@Min(1)
|
||||
|
||||
@@ -44,7 +44,10 @@ end
|
||||
--redis.log(redis.LOG_WARNING, "allowed_num " .. allowed_num)
|
||||
--redis.log(redis.LOG_WARNING, "new_tokens " .. new_tokens)
|
||||
|
||||
redis.call("setex", tokens_key, ttl, new_tokens)
|
||||
redis.call("setex", timestamp_key, ttl, now)
|
||||
if ttl > 0 then
|
||||
redis.call("setex", tokens_key, ttl, new_tokens)
|
||||
redis.call("setex", timestamp_key, ttl, now)
|
||||
end
|
||||
|
||||
-- return { allowed_num, new_tokens, capacity, filled_tokens, requested, new_tokens }
|
||||
return { allowed_num, new_tokens }
|
||||
|
||||
@@ -104,6 +104,24 @@ public class RedisRateLimiterTests extends BaseWebClientTests {
|
||||
checkLimitEnforced(id, replenishRate, burstCapacity, requestedTokens, routeId);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void redisRateLimiterWorksForZeroBurstCapacity() throws Exception {
|
||||
String id = UUID.randomUUID().toString();
|
||||
|
||||
int replenishRate = 1;
|
||||
int burstCapacity = 0;
|
||||
int requestedTokens = 1;
|
||||
|
||||
String routeId = "zero_burst_capacity_route";
|
||||
rateLimiter.getConfig().put(routeId,
|
||||
new RedisRateLimiter.Config().setBurstCapacity(burstCapacity)
|
||||
.setReplenishRate(replenishRate)
|
||||
.setRequestedTokens(requestedTokens));
|
||||
|
||||
Response response = rateLimiter.isAllowed(routeId, id).block();
|
||||
assertThat(response.isAllowed()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void keysUseRedisKeyHashTags() {
|
||||
assertThat(RedisRateLimiter.getKeys("1")).containsExactly(
|
||||
|
||||
Reference in New Issue
Block a user