Adapt rate limit tests to the new balanced methods used from chronos/TokenBucket

This commit is contained in:
NagyZoltanPeter 2025-08-27 20:34:19 +02:00
parent 745e773c2b
commit 90ccf03590
2 changed files with 11 additions and 11 deletions

View File

@ -44,8 +44,9 @@ suite "RequestRateLimiter":
# conn1 reached the 75% of the main bucket over 2 periods of time
check limiter.checkUsage(proto, conn1, now + 3.minutes) == false
# conn2 has not used its tokens while we have 1 more tokens left in the main bucket
check limiter.checkUsage(proto, conn2, now + 3.minutes) == true
# conn2 has not used its tokens but while we have 0 more tokens left in the main bucket
# it will tolerate some burst within period.
check limiter.checkUsage(proto, conn2, now + 3.minutes + 50.seconds) == true
test "RequestRateLimiter Restrict overusing peer":
# keep limits low for easier calculation of ratios
@ -55,6 +56,8 @@ suite "RequestRateLimiter":
# as ratio is 2 in this case but max tokens are main tokens*ratio . 0.75
# notice meanwhile we have 20 tokens over 2 period (4 mins) in sum
# See: waku/common/rate_limit/request_limiter.nim #func calcPeriodRatio
# This tests shows balanced token utilization as being replenished in between periods but never overusing
# intended rates.
let now = Moment.now()
# with first use we register the peer also and start its timer
@ -64,23 +67,22 @@ suite "RequestRateLimiter":
# run out of main tokens but still used one more token from the peer's bucket
check limiter.checkUsage(proto, conn1, now) == false
for i in 0 ..< 4:
for i in 0 ..< 10:
check limiter.checkUsage(proto, conn1, now + 3.minutes) == true
# conn1 reached the 75% of the main bucket over 2 periods of time
check limiter.checkUsage(proto, conn1, now + 3.minutes) == false
check limiter.checkUsage(proto, conn2, now + 3.minutes) == true
check limiter.checkUsage(proto, conn2, now + 3.minutes) == true
check limiter.checkUsage(proto, conn3, now + 3.minutes) == true
check limiter.checkUsage(proto, conn2, now + 3.minutes) == true
check limiter.checkUsage(proto, conn3, now + 3.minutes) == true
check limiter.checkUsage(proto, conn2, now + 3.minutes + 50.seconds) == true
check limiter.checkUsage(proto, conn2, now + 3.minutes + 50.seconds) == true
check limiter.checkUsage(proto, conn3, now + 3.minutes + 50.seconds) == true
check limiter.checkUsage(proto, conn2, now + 3.minutes + 50.seconds) == true
# conn1 gets replenished as the ratio was 2 giving twice as long replenish period than the main bucket
# see waku/common/rate_limit/request_limiter.nim #func calcPeriodRatio and calcPeerTokenSetting
check limiter.checkUsage(proto, conn1, now + 4.minutes) == true
# requests of other peers can also go
check limiter.checkUsage(proto, conn2, now + 4100.milliseconds) == true
check limiter.checkUsage(proto, conn2, now + 5.minutes) == true
check limiter.checkUsage(proto, conn3, now + 5.minutes) == true
test "RequestRateLimiter lowest possible volume":

View File

@ -63,8 +63,6 @@ proc checkUsage*(
let avail = peerBucket.getAvailableCapacity(now)
let globAvail = t.tokenBucket.get().getAvailableCapacity(now)
info " NZP checkUsage", peer = conn.peerId, peerAvail = avail, globalAvail = globAvail, now = now
## check requesting peer's usage is not over the calculated ratio and let that peer go which not requested much/or this time...
if not peerBucket.tryConsume(1, now):
trace "peer usage limit reached", peer = conn.peerId