#include "rdns_event.h"
#include "unix-std.h"
+static const gchar *M = "rspamd dns";
+
static struct rdns_upstream_elt* rspamd_dns_select_upstream (const char *name,
size_t len, void *ups_data);
static struct rdns_upstream_elt* rspamd_dns_select_upstream_retransmit (
if (reqdata->item) {
rspamd_symcache_item_async_dec_check (reqdata->task,
- reqdata->item);
+ reqdata->item, M);
}
if (reqdata->pool == NULL) {
rspamd_session_add_event (session,
(event_finalizer_t) rspamd_dns_fin_cb,
reqdata,
- g_quark_from_static_string ("dns resolver"));
+ M);
}
}
if (reqdata->item) {
/* We are inside some session */
- rspamd_symcache_item_async_inc (task, reqdata->item);
+ rspamd_symcache_item_async_inc (task, reqdata->item, M);
}
if (!forced && task->dns_requests >= task->cfg->dns_max_requests) {
struct rspamd_async_event {
- GQuark subsystem;
+ const gchar *subsystem;
event_finalizer_t fin;
void *user_data;
};
rspamd_session_add_event (struct rspamd_async_session *session,
event_finalizer_t fin,
gpointer user_data,
- GQuark subsystem)
+ const gchar *subsystem)
{
struct rspamd_async_event *new_event;
gint ret;
if (!RSPAMD_SESSION_CAN_ADD_EVENT (session)) {
msg_debug_session ("skip adding event subsystem: %s: "
"session is destroying/cleaning",
- g_quark_to_string (subsystem));
+ subsystem);
return NULL;
}
"subsystem: %s",
user_data,
kh_size (session->events),
- g_quark_to_string (subsystem));
+ subsystem);
kh_put (rspamd_events_hash, session->events, new_event, &ret);
g_assert (ret > 0);
msg_err_session ("cannot find event: %p(%p)", fin, ud);
kh_foreach (session->events, found_ev, t, {
msg_err_session ("existing event %s: %p(%p)",
- g_quark_to_string (found_ev->subsystem),
- found_ev->fin, found_ev->user_data);
+ found_ev->subsystem,
+ found_ev->fin,
+ found_ev->user_data);
});
(void)t;
"subsystem: %s",
ud,
kh_size (session->events),
- g_quark_to_string (found_ev->subsystem));
+ found_ev->subsystem);
kh_del (rspamd_events_hash, session->events, k);
/* Remove event */
/* Call event's finalizer */
msg_debug_session ("removed event on destroy: %p, subsystem: %s",
ev->user_data,
- g_quark_to_string (ev->subsystem));
+ ev->subsystem);
if (ev->fin != NULL) {
ev->fin (ev->user_data);
rspamd_session_add_event (struct rspamd_async_session *session,
event_finalizer_t fin,
gpointer user_data,
- GQuark subsystem);
+ const gchar *subsystem);
/**
* Remove normal event
guint
rspamd_symcache_item_async_inc (struct rspamd_task *task,
- struct rspamd_symcache_item *item)
+ struct rspamd_symcache_item *item,
+ const gchar *subsystem)
{
- msg_debug_cache_task ("increase async events counter for %s(%d) = %d + 1",
- item->symbol, item->id, item->async_events);
+ msg_debug_cache_task ("increase async events counter for %s(%d) = %d + 1; subsystem %s",
+ item->symbol, item->id, item->async_events, subsystem);
return ++item->async_events;
}
guint
rspamd_symcache_item_async_dec (struct rspamd_task *task,
- struct rspamd_symcache_item *item)
+ struct rspamd_symcache_item *item,
+ const gchar *subsystem)
{
- msg_debug_cache_task ("decrease async events counter for %s(%d) = %d - 1",
- item->symbol, item->id, item->async_events);
+ msg_debug_cache_task ("decrease async events counter for %s(%d) = %d - 1; subsystem %s",
+ item->symbol, item->id, item->async_events, subsystem);
g_assert (item->async_events > 0);
return --item->async_events;
gboolean
rspamd_symcache_item_async_dec_check (struct rspamd_task *task,
- struct rspamd_symcache_item *item)
+ struct rspamd_symcache_item *item,
+ const gchar *subsystem)
{
- if (rspamd_symcache_item_async_dec (task, item) == 0) {
+ if (rspamd_symcache_item_async_dec (task, item, subsystem) == 0) {
rspamd_symbols_cache_finalize_item (task, item);
return TRUE;
* Increase number of async events pending for an item
*/
guint rspamd_symcache_item_async_inc (struct rspamd_task *task,
- struct rspamd_symcache_item *item);
+ struct rspamd_symcache_item *item,
+ const gchar *subsystem);
/*
* Decrease number of async events pending for an item, asserts if no events pending
*/
guint rspamd_symcache_item_async_dec (struct rspamd_task *task,
- struct rspamd_symcache_item *item);
+ struct rspamd_symcache_item *item,
+ const gchar *subsystem);
/**
* Decrease number of async events pending for an item, asserts if no events pending
* @return
*/
gboolean rspamd_symcache_item_async_dec_check (struct rspamd_task *task,
- struct rspamd_symcache_item *item);
+ struct rspamd_symcache_item *item,
+ const gchar *subsystem);
#endif
#define GET_TASK_ELT(task, elt) (task == NULL ? NULL : (task)->elt)
+static const gchar *M = "redis statistics";
+
static GQuark
rspamd_redis_stat_quark (void)
{
- return g_quark_from_static_string ("redis-statistics");
+ return g_quark_from_static_string (M);
}
-
/*
* Non-static for lua unit testing
*/
if (rt->has_event) {
if (rt->item) {
- rspamd_symcache_item_async_dec_check (task, rt->item);
+ rspamd_symcache_item_async_dec_check (task, rt->item, M);
}
rspamd_session_remove_event (task->s, rspamd_redis_fin, rt);
if (rt->has_event) {
if (rt->item) {
- rspamd_symcache_item_async_dec_check (task, rt->item);
+ rspamd_symcache_item_async_dec_check (task, rt->item, M);
}
rspamd_session_remove_event (task->s, rspamd_redis_fin_learn, rt);
if (redisAsyncCommand (rt->redis, rspamd_redis_connected, rt, "HGET %s %s",
rt->redis_object_expanded, learned_key) == REDIS_OK) {
- rspamd_session_add_event (task->s,
- rspamd_redis_fin, rt, rspamd_redis_stat_quark ());
+ rspamd_session_add_event (task->s, rspamd_redis_fin, rt, M);
rt->item = rspamd_symbols_cache_get_cur_item (task);
rt->has_event = TRUE;
"RSIG");
}
- rspamd_session_add_event (task->s,
- rspamd_redis_fin_learn, rt, rspamd_redis_stat_quark ());
+ rspamd_session_add_event (task->s, rspamd_redis_fin_learn, rt, M);
rt->item = rspamd_symbols_cache_get_cur_item (task);
rt->has_event = TRUE;
#define REDIS_DEFAULT_PORT 6379
#define DEFAULT_REDIS_KEY "learned_ids"
+static const gchar *M = "redis learn cache";
+
struct rspamd_redis_cache_ctx {
struct rspamd_statfile_config *stcf;
struct upstream_list *read_servers;
static GQuark
rspamd_stat_cache_redis_quark (void)
{
- return g_quark_from_static_string ("redis-statistics");
+ return g_quark_from_static_string (M);
}
static void
if (rt->has_event) {
if (rt->item) {
- rspamd_symcache_item_async_dec_check (task, rt->item);
+ rspamd_symcache_item_async_dec_check (task, rt->item, M);
}
rspamd_session_remove_event (task->s, rspamd_redis_cache_fin, rt);
}
if (rt->has_event) {
if (rt->item) {
- rspamd_symcache_item_async_dec_check (task, rt->item);
+ rspamd_symcache_item_async_dec_check (task, rt->item, M);
}
rspamd_session_remove_event (task->s, rspamd_redis_cache_fin, rt);
}
rspamd_session_add_event (task->s,
rspamd_redis_cache_fin,
rt,
- rspamd_stat_cache_redis_quark ());
+ M);
rt->item = rspamd_symbols_cache_get_cur_item (task);
event_add (&rt->timeout_event, &tv);
rt->has_event = TRUE;
"HSET %s %s %d",
rt->ctx->redis_object, h, flag) == REDIS_OK) {
rspamd_session_add_event (task->s,
- rspamd_redis_cache_fin, rt, rspamd_stat_cache_redis_quark ());
+ rspamd_redis_cache_fin, rt, M);
rt->item = rspamd_symbols_cache_get_cur_item (task);
event_add (&rt->timeout_event, &tv);
rt->has_event = TRUE;
}
else {
/* Invalid body for spamc method */
- g_assert (0);
+ g_abort ();
}
}
struct rspamd_task **ptask;
struct thread_entry *thread_entry;
- rspamd_symcache_item_async_inc (task, item);
+ rspamd_symcache_item_async_inc (task, item, "lua symbol");
thread_entry = lua_thread_pool_get_for_task (task);
g_assert(thread_entry->cd == NULL);
struct rspamd_task *task = thread_entry->task;
msg_err_task ("call to (%s) failed (%d): %s", cd->symbol, ret, msg);
- rspamd_symcache_item_async_dec_check (task, cd->item);
+ rspamd_symcache_item_async_dec_check (task, cd->item, "lua symbol");
}
static void
g_assert (lua_gettop (L) == cd->stack_level); /* we properly cleaned up the stack */
cd->stack_level = 0;
- rspamd_symcache_item_async_dec_check (task, cd->item);
+ rspamd_symcache_item_async_dec_check (task, cd->item, "lua symbol");
}
static gint
{NULL, NULL}
};
-void
-lua_dns_callback (struct rdns_reply *reply, void *arg);
+static const gchar *M = "rspamd lua dns";
+
+void lua_dns_callback (struct rdns_reply *reply, void *arg);
struct lua_rspamd_dns_cbdata {
struct thread_entry *thread;
if (task == NULL) {
- ret = make_dns_request (cfg->dns_resolver,
+ ret = (make_dns_request (cfg->dns_resolver,
session,
pool,
lua_dns_callback,
cbdata,
type,
- to_resolve);
+ to_resolve) != NULL);
}
else {
if (forced) {
if (task) {
cbdata->item = rspamd_symbols_cache_get_cur_item (task);
- rspamd_symcache_item_async_inc (task, cbdata->item);
+ rspamd_symcache_item_async_inc (task, cbdata->item, M);
}
return lua_thread_yield (cbdata->thread, 0);
lua_thread_resume (cbdata->thread, 2);
if (cbdata->item) {
- rspamd_symcache_item_async_dec_check (cbdata->task, cbdata->item);
+ rspamd_symcache_item_async_dec_check (cbdata->task, cbdata->item, M);
}
}
task:get_resolver():resolve_a({task = task, name = host, callback = dns_cb})
end
*/
+
+static const gchar *M = "rspamd lua dns resolver";
+
struct rspamd_dns_resolver * lua_check_dns_resolver (lua_State * L);
void luaopen_dns_resolver (lua_State * L);
lua_thread_pool_restore_callback (&cbs);
if (cd->item) {
- rspamd_symcache_item_async_dec_check (cd->task, cd->item);
+ rspamd_symcache_item_async_dec_check (cd->task, cd->item, M);
}
if (!cd->pool) {
* lua_dns_resolver_callback without switching to the event loop
*/
if (cbdata->item) {
- rspamd_symcache_item_async_inc (task, cbdata->item);
+ rspamd_symcache_item_async_inc (task, cbdata->item, M);
}
if (forced) {
cbdata->item = rspamd_symbols_cache_get_cur_item (task);
if (cbdata->item) {
- rspamd_symcache_item_async_inc (task, cbdata->item);
+ rspamd_symcache_item_async_inc (task, cbdata->item, M);
}
/* callback was set up */
lua_pushboolean (L, TRUE);
}
if (cbdata->item) {
- rspamd_symcache_item_async_dec_check (task, cbdata->item);
+ rspamd_symcache_item_async_dec_check (task, cbdata->item, M);
}
}
}
#define MAX_HEADERS_SIZE 8192
+static const gchar *M = "rspamd lua http";
+
LUA_FUNCTION_DEF (http, request);
static const struct luaL_reg httplib_m[] = {
if (cbd->flags & RSPAMD_LUA_HTTP_FLAG_RESOLVED) {
/* Event is added merely for resolved events */
if (cbd->item) {
- rspamd_symcache_item_async_dec_check (cbd->task, cbd->item);
+ rspamd_symcache_item_async_dec_check (cbd->task, cbd->item, M);
}
rspamd_session_remove_event (cbd->session, lua_http_fin, cbd);
if (cbd->session) {
rspamd_session_add_event (cbd->session,
(event_finalizer_t) lua_http_fin, cbd,
- g_quark_from_static_string ("lua http"));
+ M);
cbd->flags |= RSPAMD_LUA_HTTP_FLAG_RESOLVED;
}
if (cbd->item) {
- rspamd_symcache_item_async_inc (cbd->task, cbd->item);
+ rspamd_symcache_item_async_inc (cbd->task, cbd->item, M);
}
return TRUE;
}
if (cbd->item) {
- rspamd_symcache_item_async_dec_check (cbd->task, cbd->item);
+ rspamd_symcache_item_async_dec_check (cbd->task, cbd->item, M);
}
}
return 1;
}
else if (cbd->item) {
- rspamd_symcache_item_async_inc (cbd->task, cbd->item);
+ rspamd_symcache_item_async_inc (cbd->task, cbd->item, M);
}
}
}
#define REDIS_DEFAULT_TIMEOUT 1.0
+static const gchar *M = "rspamd lua redis";
+
/***
* @module rspamd_redis
* This module implements redis asynchronous client for rspamd LUA API.
if (connected && ud->s) {
if (ud->item) {
- rspamd_symcache_item_async_dec_check (ud->task, ud->item);
+ rspamd_symcache_item_async_dec_check (ud->task, ud->item, M);
}
rspamd_session_remove_event (ud->s, lua_redis_fin, sp_ud);
if (ud->s) {
if (ud->item) {
- rspamd_symcache_item_async_dec_check (ud->task, ud->item);
+ rspamd_symcache_item_async_dec_check (ud->task, ud->item, M);
}
rspamd_session_remove_event (ud->s, lua_redis_fin, sp_ud);
struct lua_redis_result *result = g_queue_pop_head (ctx->events_cleanup);
if (result->item) {
- rspamd_symcache_item_async_dec_check (result->task, result->item);
+ rspamd_symcache_item_async_dec_check (result->task, result->item, M);
}
rspamd_session_remove_event (result->s, lua_redis_fin, result->sp_ud);
if (ud->s) {
rspamd_session_add_event (ud->s,
lua_redis_fin, sp_ud,
- g_quark_from_static_string ("lua redis"));
+ M);
if (ud->item) {
- rspamd_symcache_item_async_inc (ud->task, ud->item);
+ rspamd_symcache_item_async_inc (ud->task, ud->item, M);
}
}
rspamd_session_add_event (ud->s,
lua_redis_fin,
sp_ud,
- g_quark_from_static_string ("lua redis"));
+ M);
if (ud->item) {
- rspamd_symcache_item_async_inc (ud->task, ud->item);
+ rspamd_symcache_item_async_inc (ud->task, ud->item, M);
}
}
#include "unix-std.h"
#include <math.h>
+static const gchar *M = "rspamd lua tcp";
+
/***
* @module rspamd_tcp
* Rspamd TCP module represents generic TCP asynchronous client available from LUA code.
*/
if (cbd->item) {
- rspamd_symcache_item_async_dec_check (cbd->task, cbd->item);
+ rspamd_symcache_item_async_dec_check (cbd->task, cbd->item, M);
cbd->item = NULL;
}
}
else {
if (cbd->item) {
- rspamd_symcache_item_async_dec_check (cbd->task, cbd->item);
+ rspamd_symcache_item_async_dec_check (cbd->task, cbd->item, M);
cbd->item = NULL;
}
if (cbd->session) {
event_finalizer_t fin = IS_SYNC (cbd) ? lua_tcp_void_finalyser : lua_tcp_fin;
- cbd->async_ev = rspamd_session_add_event (cbd->session, fin, cbd,
- g_quark_from_static_string ("lua tcp"));
+ cbd->async_ev = rspamd_session_add_event (cbd->session, fin, cbd, M);
if (!cbd->async_ev) {
return FALSE;
lua_tcp_register_watcher (struct lua_tcp_cbdata *cbd)
{
if (cbd->item) {
- rspamd_symcache_item_async_inc (cbd->task, cbd->item);
+ rspamd_symcache_item_async_inc (cbd->task, cbd->item, M);
}
}
#define DEFAULT_TIME_JITTER 60
#define DEFAULT_MAX_SIGS 5
+static const gchar *M = "rspamd dkim plugin";
+
static const gchar default_sign_headers[] = ""
"(o)from:(o)sender:(o)reply-to:(o)subject:(o)date:(o)message-id:"
"(o)to:(o)cc:(o)mime-version:(o)content-type:(o)content-transfer-encoding:"
return;
}
- rspamd_symcache_item_async_inc (task, item);
+ rspamd_symcache_item_async_inc (task, item, M);
/* Now check if a message has its signature */
hlist = rspamd_message_get_header_array (task,
dkim_module_check (res);
}
- rspamd_symcache_item_async_dec_check (task, item);
+ rspamd_symcache_item_async_dec_check (task, item, M);
}
static void
#define RSPAMD_FUZZY_PLUGIN_VERSION RSPAMD_FUZZY_VERSION
static const gint rspamd_fuzzy_hash_len = 5;
+static const gchar *M = "fuzzy check";
struct fuzzy_ctx;
struct fuzzy_mapping {
if (nreplied == session->commands->len) {
fuzzy_insert_metric_results (session->task, session->results);
if (session->item) {
- rspamd_symcache_item_async_dec_check (session->task, session->item);
+ rspamd_symcache_item_async_dec_check (session->task, session->item, M);
}
rspamd_session_remove_event (session->task->s, fuzzy_io_fin, session);
rspamd_upstream_fail (session->server, FALSE);
if (session->item) {
- rspamd_symcache_item_async_dec_check (session->task, session->item);
+ rspamd_symcache_item_async_dec_check (session->task, session->item, M);
}
rspamd_session_remove_event (session->task->s, fuzzy_io_fin, session);
}
session->retransmits);
rspamd_upstream_fail (session->server, FALSE);
if (session->item) {
- rspamd_symcache_item_async_dec_check (session->task, session->item);
+ rspamd_symcache_item_async_dec_check (session->task, session->item, M);
}
rspamd_session_remove_event (session->task->s, fuzzy_io_fin, session);
}
session->task->message_id, strerror (errno));
if (*(session->err) == NULL) {
g_set_error (session->err,
- g_quark_from_static_string ("fuzzy check"),
+ g_quark_from_static_string (M),
errno, "read socket error: %s", strerror (errno));
}
ret = return_error;
if (*(session->err) == NULL) {
g_set_error (session->err,
- g_quark_from_static_string ("fuzzy check"),
+ g_quark_from_static_string (M),
rep->v1.value, "fuzzy hash is skipped");
}
}
if (*(session->err) == NULL) {
g_set_error (session->err,
- g_quark_from_static_string ("fuzzy check"),
+ g_quark_from_static_string (M),
rep->v1.value, "process fuzzy error");
}
}
if (!fuzzy_cmd_vector_to_wire (fd, session->commands)) {
if (*(session->err) == NULL) {
g_set_error (session->err,
- g_quark_from_static_string ("fuzzy check"),
+ g_quark_from_static_string (M),
errno, "write socket error: %s", strerror (errno));
}
ret = return_error;
event_base_set (session->task->ev_base, &session->timev);
event_add (&session->timev, &session->tv);
- rspamd_session_add_event (task->s, fuzzy_io_fin, session,
- g_quark_from_static_string ("fuzzy check"));
+ rspamd_session_add_event (task->s, fuzzy_io_fin, session, M);
session->item = rspamd_symbols_cache_get_cur_item (task);
if (session->item) {
- rspamd_symcache_item_async_inc (task, session->item);
+ rspamd_symcache_item_async_inc (task, session->item, M);
}
}
}
}
}
- rspamd_symcache_item_async_inc (task, item);
+ rspamd_symcache_item_async_inc (task, item, M);
PTR_ARRAY_FOREACH (fuzzy_module_ctx->fuzzy_rules, i, rule) {
commands = fuzzy_generate_commands (task, rule, FUZZY_CHECK, 0, 0, 0);
}
}
- rspamd_symcache_item_async_dec_check (task, item);
+ rspamd_symcache_item_async_dec_check (task, item, M);
}
void
rspamd_session_add_event (task->s,
fuzzy_lua_fin,
s,
- g_quark_from_static_string ("fuzzy check"));
+ M);
(*saved)++;
ret = 1;
#define DEFAULT_SYMBOL_NA "R_SPF_NA"
#define DEFAULT_CACHE_SIZE 2048
+static const gchar *M = "rspamd spf plugin";
+
struct spf_ctx {
struct module_ctx ctx;
const gchar *symbol_fail;
spf_record_unref (l);
}
- rspamd_symcache_item_async_dec_check (task, item);
+ rspamd_symcache_item_async_dec_check (task, item, M);
}
}
domain = rspamd_spf_get_domain (task);
- rspamd_symcache_item_async_inc (task, item);
+ rspamd_symcache_item_async_inc (task, item, M);
if (domain) {
if ((l =
"(SPF): spf DNS fail");
}
else {
- rspamd_symcache_item_async_inc (task, item);
+ rspamd_symcache_item_async_inc (task, item, M);
}
}
}
- rspamd_symcache_item_async_dec_check (task, item);
+ rspamd_symcache_item_async_dec_check (task, item, M);
}
INIT_LOG_MODULE(surbl)
+static const gchar *M = "surbl";
+
#define DEFAULT_SURBL_WEIGHT 10
#define DEFAULT_REDIRECTOR_READ_TIMEOUT 5.0
#define DEFAULT_SURBL_SYMBOL "SURBL_DNS"
surbl_dns_ip_callback,
(void *) param, RDNS_REQUEST_A, surbl_req)) {
param->item = item;
- rspamd_symcache_item_async_inc (task, item);
+ rspamd_symcache_item_async_inc (task, item, M);
}
}
}
surbl_dns_callback,
(void *) param, RDNS_REQUEST_A, surbl_req)) {
param->item = item;
- rspamd_symcache_item_async_inc (task, item);
+ rspamd_symcache_item_async_inc (task, item, M);
}
}
else if (err != NULL) {
param->suffix->suffix);
}
- rspamd_symcache_item_async_dec_check (param->task, param->item);
+ rspamd_symcache_item_async_dec_check (param->task, param->item, M);
}
static void
if (make_dns_request_task (task,
surbl_dns_callback,
param, RDNS_REQUEST_A, to_resolve->str)) {
- rspamd_symcache_item_async_inc (param->task, param->item);
+ rspamd_symcache_item_async_inc (param->task, param->item, M);
}
g_string_free (to_resolve, TRUE);
}
- rspamd_symcache_item_async_dec_check (param->task, param->item);
+ rspamd_symcache_item_async_dec_check (param->task, param->item, M);
}
static void
struct redirector_param *param = (struct redirector_param *)ud;
if (param->item) {
- rspamd_symcache_item_async_dec_check (param->task, param->item);
+ rspamd_symcache_item_async_dec_check (param->task, param->item, M);
}
rspamd_http_connection_unref (param->conn);
rspamd_session_add_event (task->s,
free_redirector_session, param,
- g_quark_from_static_string ("surbl"));
+ M);
param->item = rspamd_symbols_cache_get_cur_item (task);
if (param->item) {
- rspamd_symcache_item_async_inc (param->task, param->item);
+ rspamd_symcache_item_async_inc (param->task, param->item, M);
}
rspamd_http_connection_write_message (param->conn, msg, NULL,
param->tree);
g_hash_table_foreach (task->urls, surbl_tree_url_callback, param);
- rspamd_symcache_item_async_inc (task, item);
+ rspamd_symcache_item_async_inc (task, item, M);
/* We also need to check and process img URLs */
if (suffix->options & SURBL_OPTION_CHECKIMAGES) {
}
}
- rspamd_symcache_item_async_dec_check (task, item);
+ rspamd_symcache_item_async_dec_check (task, item, M);
}
static void
return;
}
- rspamd_symcache_item_async_inc (task, item);
+ rspamd_symcache_item_async_inc (task, item, M);
param = rspamd_mempool_alloc0 (task->task_pool, sizeof (*param));
param->task = task;
param->redirector_requests = 0;
param->ctx = surbl_module_ctx;
param->item = item;
- rspamd_symcache_item_async_inc (task, item);
+ rspamd_symcache_item_async_inc (task, item, M);
g_hash_table_foreach (task->urls, surbl_tree_redirector_callback, param);
/* We also need to check and process img URLs */
}
}
- rspamd_symcache_item_async_dec_check (task, item);
+ rspamd_symcache_item_async_dec_check (task, item, M);
}