Allows 0 burstCapacity.

Fixes gh-1312
This commit is contained in:
Spencer Gibb
2020-04-08 22:49:04 -04:00
parent f4bb8f102f
commit 2821def4fd
3 changed files with 42 additions and 17 deletions

View File

@@ -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)

View File

@@ -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 }

View File

@@ -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(