From f4afd62f24839b0c30056891f881f153305c2864 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 16 Jan 2020 12:13:35 +0000 Subject: [PATCH] [Minor] Try to fix slow timer race condition --- src/libserver/rspamd_symcache.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/libserver/rspamd_symcache.c b/src/libserver/rspamd_symcache.c index 499d58c28..212ae76e7 100644 --- a/src/libserver/rspamd_symcache.c +++ b/src/libserver/rspamd_symcache.c @@ -3038,6 +3038,7 @@ rspamd_symcache_delayed_item_cb (EV_P_ ev_timer *w, int what) task = cbd->task; checkpoint = task->checkpoint; checkpoint->has_slow = FALSE; + cbd->event = NULL; ev_timer_stop (EV_A_ w); /* Process all reverse dependencies */ @@ -3073,7 +3074,12 @@ rspamd_delayed_timer_dtor (gpointer d) struct rspamd_symcache_delayed_cbdata *cbd = (struct rspamd_symcache_delayed_cbdata *)d; - ev_timer_stop (cbd->task->event_loop, &cbd->tm); + if (cbd->event) { + ev_timer_stop (cbd->task->event_loop, &cbd->tm); + /* Event has not been executed */ + rspamd_session_remove_event (cbd->task->s, NULL, cbd); + cbd->event = NULL; + } } /** @@ -3088,6 +3094,7 @@ rspamd_symcache_finalize_item (struct rspamd_task *task, struct rspamd_symcache_dynamic_item *dyn_item; gdouble diff; guint i; + gboolean enable_slow_timer = FALSE; const gdouble slow_diff_limit = 300; /* Sanity checks */ @@ -3121,9 +3128,19 @@ rspamd_symcache_finalize_item (struct rspamd_task *task, dyn_item->start_msec); if (diff > slow_diff_limit) { - msg_info_task ("slow rule: %s(%d): %.2f ms", item->symbol, item->id, - diff); - checkpoint->has_slow = TRUE; + + if (!checkpoint->has_slow) { + checkpoint->has_slow = TRUE; + enable_slow_timer = TRUE; + msg_info_task ("slow rule: %s(%d): %.2f ms; enable slow timer delay", + item->symbol, item->id, + diff); + } + else { + msg_info_task ("slow rule: %s(%d): %.2f ms", + item->symbol, item->id, + diff); + } } if (G_UNLIKELY (RSPAMD_TASK_IS_PROFILING (task))) { @@ -3135,7 +3152,7 @@ rspamd_symcache_finalize_item (struct rspamd_task *task, } } - if (checkpoint->has_slow) { + if (enable_slow_timer) { struct rspamd_symcache_delayed_cbdata *cbd = rspamd_mempool_alloc (task->task_pool, sizeof (*cbd)); /* Add timer to allow something else to be executed */ -- 2.39.5