aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rspamd.com>2024-11-11 18:54:51 +0600
committerGitHub <noreply@github.com>2024-11-11 18:54:51 +0600
commitafb9ccc0d5e59a293831ee70bc3f10f7a2ffbafb (patch)
tree5628dc17b0db75b319d7a49d85bf9a66354e7860
parent95151295e8358136add594e2c5b048e79b19a130 (diff)
parent6140c9eabf1d5cb58da7f925f35bdd89749dca8a (diff)
downloadrspamd-afb9ccc0d5e59a293831ee70bc3f10f7a2ffbafb.tar.gz
rspamd-afb9ccc0d5e59a293831ee70bc3f10f7a2ffbafb.zip
Merge pull request #5162 from left-try/master
Store LRU cache of last filled ratelimit buckets
-rw-r--r--lualib/redis_scripts/ratelimit_check.lua5
-rw-r--r--src/plugins/lua/ratelimit.lua5
2 files changed, 9 insertions, 1 deletions
diff --git a/lualib/redis_scripts/ratelimit_check.lua b/lualib/redis_scripts/ratelimit_check.lua
index f24e0daf0..019996c11 100644
--- a/lualib/redis_scripts/ratelimit_check.lua
+++ b/lualib/redis_scripts/ratelimit_check.lua
@@ -31,6 +31,8 @@ local leak_rate = tonumber(KEYS[3])
local max_burst = tonumber(KEYS[4])
local prefix = KEYS[1]
local enable_dynamic = KEYS[7] == 'true'
+local lfb_cache_prefix = KEYS[8]
+local lfb_max_cache_size = tonumber(KEYS[9])
local dynr, dynb, leaked = 0, 0, 0
if not last then
-- New bucket
@@ -83,6 +85,9 @@ if burst + pending > 0 then
burst = burst + pending
if burst > 0 and burst > max_burst * dynb then
+ redis.call('ZREMRANGEBYRANK', lfb_cache_prefix, 0, -(lfb_max_cache_size + 1)) -- Keeping size of lfb cache
+ redis.call('ZADD', lfb_cache_prefix, now, prefix) -- LRU cache is based on timestamps of buckets
+
return { 1, tostring(burst - pending), tostring(dynr), tostring(dynb), tostring(leaked) }
end
-- Increase pending if we allow ratelimit
diff --git a/src/plugins/lua/ratelimit.lua b/src/plugins/lua/ratelimit.lua
index 168d8d63a..c20e61b17 100644
--- a/src/plugins/lua/ratelimit.lua
+++ b/src/plugins/lua/ratelimit.lua
@@ -41,6 +41,8 @@ local settings = {
-- Do not check ratelimits for these recipients
whitelisted_rcpts = { 'postmaster', 'mailer-daemon' },
prefix = 'RL',
+ lfb_cache_prefix = 'RL_cache_prefix', -- Last filled buckets cache prefix
+ lfb_max_cache_size = 30,
-- If enabled, we apply dynamic rate limiting based on the verdict
dynamic_rate_limit = false,
ham_factor_rate = 1.01,
@@ -455,7 +457,8 @@ local function ratelimit_cb(task)
{ key = value.hash, task = task, is_write = true },
gen_check_cb(pr, bucket, value.name, value.hash),
{ value.hash, tostring(now), tostring(rate), tostring(bucket.burst),
- tostring(settings.expire), tostring(bincr), tostring(dyn_rate_enabled) })
+ tostring(settings.expire), tostring(bincr), tostring(dyn_rate_enabled),
+ tostring(settings.lfb_cache_prefix), tostring(settings.lfb_max_cache_size) })
end
end
end