From 3d2cadb16676133ac3007da65630996168be3c91 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 12 Feb 2019 11:59:25 +0000 Subject: [PATCH] [Project] Implement concept of adaptive disabling of the rules --- src/libserver/rspamd_symcache.c | 15 ++++++++------- src/libserver/rspamd_symcache.h | 12 ++++++++++++ src/lua/lua_task.c | 6 ++++-- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/libserver/rspamd_symcache.c b/src/libserver/rspamd_symcache.c index f6487f4d8..92f75ecbb 100644 --- a/src/libserver/rspamd_symcache.c +++ b/src/libserver/rspamd_symcache.c @@ -235,8 +235,6 @@ static void rspamd_symcache_disable_symbol_checkpoint (struct rspamd_task *task, struct rspamd_symcache *cache, const gchar *symbol); static void rspamd_symcache_enable_symbol_checkpoint (struct rspamd_task *task, struct rspamd_symcache *cache, const gchar *symbol); -static void rspamd_symcache_disable_all_symbols (struct rspamd_task *task, - struct rspamd_symcache *cache); static void rspamd_symcache_order_dtor (gpointer p) @@ -1598,7 +1596,8 @@ rspamd_symcache_process_settings (struct rspamd_task *task, if (enabled) { /* Disable all symbols but selected */ - rspamd_symcache_disable_all_symbols (task, cache); + rspamd_symcache_disable_all_symbols (task, cache, + SYMBOL_TYPE_EXPLICIT_DISABLE); already_disabled = TRUE; it = NULL; @@ -1615,7 +1614,8 @@ rspamd_symcache_process_settings (struct rspamd_task *task, it = NULL; if (!already_disabled) { - rspamd_symcache_disable_all_symbols (task, cache); + rspamd_symcache_disable_all_symbols (task, cache, + SYMBOL_TYPE_EXPLICIT_DISABLE); } while ((cur = ucl_iterate_object (enabled, &it, true)) != NULL) { @@ -2274,9 +2274,10 @@ rspamd_symcache_stats_symbols_count (struct rspamd_symcache *cache) } -static void +void rspamd_symcache_disable_all_symbols (struct rspamd_task *task, - struct rspamd_symcache *cache) + struct rspamd_symcache *cache, + guint skip_mask) { struct cache_savepoint *checkpoint; guint i; @@ -2295,7 +2296,7 @@ rspamd_symcache_disable_all_symbols (struct rspamd_task *task, PTR_ARRAY_FOREACH (cache->items_by_id, i, item) { dyn_item = rspamd_symcache_get_dynamic (checkpoint, item); - if (!(item->type & SYMBOL_TYPE_SQUEEZED)) { + if (!(item->type & (SYMBOL_TYPE_SQUEEZED|skip_mask))) { SET_FINISH_BIT (checkpoint, dyn_item); SET_START_BIT (checkpoint, dyn_item); } diff --git a/src/libserver/rspamd_symcache.h b/src/libserver/rspamd_symcache.h index ab9c568e1..b5e029a6b 100644 --- a/src/libserver/rspamd_symcache.h +++ b/src/libserver/rspamd_symcache.h @@ -48,6 +48,8 @@ enum rspamd_symbol_type { SYMBOL_TYPE_SQUEEZED = (1 << 13), /* Symbol is squeezed inside Lua */ SYMBOL_TYPE_TRIVIAL = (1 << 14), /* Symbol is trivial */ SYMBOL_TYPE_MIME_ONLY = (1 << 15), /* Symbol is mime only */ + SYMBOL_TYPE_EXPLICIT_DISABLE = (1 << 16), /* Symbol should be disabled explicitly only */ + SYMBOL_TYPE_IGNORE_PASSTHROUGH = (1 << 17), /* Symbol ignores passthrough result */ }; /** @@ -374,4 +376,14 @@ gboolean rspamd_symcache_item_async_dec_check_full (struct rspamd_task *task, const gchar *loc); #define rspamd_symcache_item_async_dec_check(task, item, subsystem) \ rspamd_symcache_item_async_dec_check_full(task, item, subsystem, G_STRLOC) + +/** + * Disables execution of all symbols, excluding those specified in `skip_mask` + * @param task + * @param cache + * @param skip_mask + */ +void rspamd_symcache_disable_all_symbols (struct rspamd_task *task, + struct rspamd_symcache *cache, + guint skip_mask); #endif diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c index 90cb1f689..b6c5c1fb7 100644 --- a/src/lua/lua_task.c +++ b/src/lua/lua_task.c @@ -1771,10 +1771,12 @@ lua_task_set_pre_result (lua_State * L) rspamd_mempool_strdup (task->task_pool, module)); /* Don't classify or filter message if pre-filter sets results */ - task->processed_stages |= (RSPAMD_TASK_STAGE_FILTERS | - RSPAMD_TASK_STAGE_CLASSIFIERS | + task->processed_stages |= (RSPAMD_TASK_STAGE_CLASSIFIERS | RSPAMD_TASK_STAGE_CLASSIFIERS_PRE | RSPAMD_TASK_STAGE_CLASSIFIERS_POST); + rspamd_symcache_disable_all_symbols (task, task->cfg->cache, + SYMBOL_TYPE_IDEMPOTENT|SYMBOL_TYPE_IGNORE_PASSTHROUGH| + SYMBOL_TYPE_POSTFILTER); } else { return luaL_error (L, "invalid arguments"); -- 2.39.5