Browse Source

[Minor] Fix various issues in ratelimit

tags/1.7.3
Vsevolod Stakhov 6 years ago
parent
commit
7f7ee7f0f3
1 changed files with 16 additions and 9 deletions
  1. 16
    9
      src/plugins/lua/ratelimit.lua

+ 16
- 9
src/plugins/lua/ratelimit.lua View File

]] ]]
local bucket_update_id local bucket_update_id


local message_func = function(_, limit_type, _)
-- message_func(task, limit_type, prefix, bucket)
local message_func = function(_, limit_type, _, _)
return string.format('Ratelimit "%s" exceeded', limit_type) return string.format('Ratelimit "%s" exceeded', limit_type)
end end


local prefix = gen_rate_key(task, k, bucket) local prefix = gen_rate_key(task, k, bucket)


if prefix then if prefix then
prefixes[prefix] = bucket
prefixes[prefix] = {
bucket = bucket,
name = k,
}
nprefixes = nprefixes + 1 nprefixes = nprefixes + 1
end end
end end
end end


local function gen_check_cb(prefix, bucket)
local function gen_check_cb(prefix, bucket, lim_name)
return function(err, data) return function(err, data)
if err then if err then
rspamd_logger.errx('cannot check limit %s: %s %s', prefix, err, data) rspamd_logger.errx('cannot check limit %s: %s %s', prefix, err, data)
task:insert_result(settings.info_symbol, 1.0, prefix) task:insert_result(settings.info_symbol, 1.0, prefix)
end end
rspamd_logger.infox(task, rspamd_logger.infox(task,
'ratelimit "%s" exceeded, (%s / %s)',
prefix, bucket[2], bucket[1])
'ratelimit "%s(%s)" exceeded, (%s / %s)',
lim_name, prefix, bucket[2], bucket[1])
task:set_pre_result('soft reject', task:set_pre_result('soft reject',
message_func(task, prefix, bucket))
message_func(task, lim_name, prefix, bucket))
end end
end end
end end
now = lua_util.round(now * 1000.0) -- Get milliseconds now = lua_util.round(now * 1000.0) -- Get milliseconds
-- Now call check script for all defined prefixes -- Now call check script for all defined prefixes


for pr,bucket in pairs(prefixes) do
for pr,value in pairs(prefixes) do
local bucket = value.bucket
local rate = (1.0 / bucket[1]) / 1000.0 -- Leak rate in messages/ms local rate = (1.0 / bucket[1]) / 1000.0 -- Leak rate in messages/ms
rspamd_logger.debugm(N, task, "check limit %s (%s/%s)", rspamd_logger.debugm(N, task, "check limit %s (%s/%s)",
pr, bucket[2], bucket[1]) pr, bucket[2], bucket[1])
lua_redis.exec_redis_script(bucket_check_id, lua_redis.exec_redis_script(bucket_check_id,
{task = task, is_write = true}, {task = task, is_write = true},
gen_check_cb(pr, bucket),
gen_check_cb(pr, bucket, value.name),
{pr, tostring(now), tostring(rate), tostring(bucket[2]), {pr, tostring(now), tostring(rate), tostring(bucket[2]),
tostring(settings.expire)}) tostring(settings.expire)})
end end
if action == 'soft reject' then if action == 'soft reject' then
-- Already rate limited/greylisted, do nothing -- Already rate limited/greylisted, do nothing
rspamd_logger.debugm(N, task, 'already soft rejected, do not update') rspamd_logger.debugm(N, task, 'already soft rejected, do not update')
return
elseif action == 'no action' then elseif action == 'no action' then
is_spam = false is_spam = false
end end


-- Update each bucket -- Update each bucket
for k, v in pairs(prefixes) do for k, v in pairs(prefixes) do
local bucket = v.bucket
local function update_bucket_cb(err, _) local function update_bucket_cb(err, _)
if err then if err then
rspamd_logger.errx(task, 'cannot update rate bucket %s: %s', rspamd_logger.errx(task, 'cannot update rate bucket %s: %s',
local now = rspamd_util.get_time() local now = rspamd_util.get_time()
now = lua_util.round(now * 1000.0) -- Get milliseconds now = lua_util.round(now * 1000.0) -- Get milliseconds
rspamd_logger.debugm(N, task, "update limit %s (%s/%s)", rspamd_logger.debugm(N, task, "update limit %s (%s/%s)",
k, v[2], v[1])
k, bucket[2], bucket[1])
lua_redis.exec_redis_script(bucket_update_id, lua_redis.exec_redis_script(bucket_update_id,
{task = task, is_write = true}, {task = task, is_write = true},
update_bucket_cb, update_bucket_cb,

Loading…
Cancel
Save