mirror of
https://github.com/discourse/discourse.git
synced 2025-06-03 02:48:28 +08:00
FIX: Use the same time moment for related Redis calls in rate limiter (#11692)
Co-authored-by: Robin Ward <robin.ward@gmail.com>
This commit is contained in:

committed by
GitHub

parent
e25dd41aee
commit
0f1c9a2180
@ -112,7 +112,7 @@ class RateLimiter
|
|||||||
now = Time.now.to_i
|
now = Time.now.to_i
|
||||||
|
|
||||||
if ((max || 0) <= 0) || rate_limiter_allowed?(now)
|
if ((max || 0) <= 0) || rate_limiter_allowed?(now)
|
||||||
raise RateLimiter::LimitExceeded.new(seconds_to_wait, @type) if raise_error
|
raise RateLimiter::LimitExceeded.new(seconds_to_wait(now), @type) if raise_error
|
||||||
false
|
false
|
||||||
else
|
else
|
||||||
true
|
true
|
||||||
@ -173,20 +173,22 @@ class RateLimiter
|
|||||||
Discourse.redis.without_namespace
|
Discourse.redis.without_namespace
|
||||||
end
|
end
|
||||||
|
|
||||||
def seconds_to_wait
|
def seconds_to_wait(now)
|
||||||
@secs - age_of_oldest
|
@secs - age_of_oldest(now)
|
||||||
end
|
end
|
||||||
|
|
||||||
def age_of_oldest
|
def age_of_oldest(now)
|
||||||
# age of oldest event in buffer, in seconds
|
# age of oldest event in buffer, in seconds
|
||||||
Time.now.to_i - redis.lrange(prefixed_key, -1, -1).first.to_i
|
now - redis.lrange(prefixed_key, -1, -1).first.to_i
|
||||||
end
|
end
|
||||||
|
|
||||||
def is_under_limit?
|
def is_under_limit?
|
||||||
|
now = Time.now.to_i
|
||||||
|
|
||||||
# number of events in buffer less than max allowed? OR
|
# number of events in buffer less than max allowed? OR
|
||||||
(redis.llen(prefixed_key) < @max) ||
|
(redis.llen(prefixed_key) < @max) ||
|
||||||
# age bigger or equal than sliding window size?
|
# age bigger than silding window size?
|
||||||
(age_of_oldest >= @secs)
|
(age_of_oldest(now) >= @secs)
|
||||||
end
|
end
|
||||||
|
|
||||||
def rate_unlimited?
|
def rate_unlimited?
|
||||||
|
Reference in New Issue
Block a user