diff options
Diffstat (limited to 'src/libserver/worker_util.c')
-rw-r--r-- | src/libserver/worker_util.c | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/src/libserver/worker_util.c b/src/libserver/worker_util.c index 75836573f..fdcc5a4b3 100644 --- a/src/libserver/worker_util.c +++ b/src/libserver/worker_util.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 Vsevolod Stakhov + * Copyright 2025 Vsevolod Stakhov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -167,7 +167,7 @@ static void rspamd_worker_terminate_handlers(struct rspamd_worker *w) { if (w->nconns == 0 && - (!(w->flags & RSPAMD_WORKER_SCANNER) || w->srv->cfg->on_term_scripts == NULL)) { + (!(w->flags & (RSPAMD_WORKER_SCANNER | RSPAMD_WORKER_FUZZY)) || w->srv->cfg->on_term_scripts == NULL)) { /* * We are here either: * - No active connections are represented @@ -190,7 +190,7 @@ rspamd_worker_terminate_handlers(struct rspamd_worker *w) if (w->state != rspamd_worker_wait_final_scripts) { w->state = rspamd_worker_wait_final_scripts; - if ((w->flags & RSPAMD_WORKER_SCANNER) && + if ((w->flags & (RSPAMD_WORKER_SCANNER | RSPAMD_WORKER_FUZZY)) && rspamd_worker_call_finish_handlers(w)) { msg_info("performing async finishing actions"); w->state = rspamd_worker_wait_final_scripts; @@ -1908,14 +1908,27 @@ rspamd_worker_hyperscan_ready(struct rspamd_main *rspamd_main, memset(&rep, 0, sizeof(rep)); rep.type = RSPAMD_CONTROL_HYPERSCAN_LOADED; - if (rspamd_re_cache_is_hs_loaded(cache) != RSPAMD_HYPERSCAN_LOADED_FULL || - cmd->cmd.hs_loaded.forced) { + /* Check if this is a scoped notification */ + if (cmd->cmd.hs_loaded.scope[0] != '\0') { + /* Scoped hyperscan loading */ + const char *scope = cmd->cmd.hs_loaded.scope; - msg_info("loading hyperscan expressions after receiving compilation " - "notice: %s", - (rspamd_re_cache_is_hs_loaded(cache) != RSPAMD_HYPERSCAN_LOADED_FULL) ? "new db" : "forced update"); - rep.reply.hs_loaded.status = rspamd_re_cache_load_hyperscan( - worker->srv->cfg->re_cache, cmd->cmd.hs_loaded.cache_dir, false); + msg_info("loading hyperscan expressions for scope '%s' after receiving compilation notice", scope); + + rep.reply.hs_loaded.status = rspamd_re_cache_load_hyperscan_scoped( + cache, cmd->cmd.hs_loaded.cache_dir, false); + } + else { + /* Legacy/full cache loading */ + if (rspamd_re_cache_is_hs_loaded(cache) != RSPAMD_HYPERSCAN_LOADED_FULL || + cmd->cmd.hs_loaded.forced) { + + msg_info("loading hyperscan expressions after receiving compilation " + "notice: %s", + (rspamd_re_cache_is_hs_loaded(cache) != RSPAMD_HYPERSCAN_LOADED_FULL) ? "new db" : "forced update"); + rep.reply.hs_loaded.status = rspamd_re_cache_load_hyperscan( + worker->srv->cfg->re_cache, cmd->cmd.hs_loaded.cache_dir, false); + } } if (write(fd, &rep, sizeof(rep)) != sizeof(rep)) { @@ -2138,7 +2151,7 @@ rspamd_controller_load_saved_stats(struct rspamd_main *rspamd_main, return; } - parser = ucl_parser_new(0); + parser = ucl_parser_new(UCL_PARSER_SAFE_FLAGS); if (!ucl_parser_add_file(parser, cfg->stats_file)) { msg_err_config("cannot parse controller stats from %s: %s", @@ -2556,4 +2569,4 @@ rspamd_metrics_to_prometheus_string(const ucl_object_t *top) /* Must be finalized and freed by caller */ return output; -}
\ No newline at end of file +} |