From ff74d742158c985d4e59655f6989e68a024122d7 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 26 Dec 2015 17:50:35 +0000 Subject: [PATCH] Implement forced timeout for delayed filters Issue: #452 --- src/libserver/events.c | 17 ++++++++++++++--- src/libserver/events.h | 5 +++++ src/worker.c | 2 ++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/libserver/events.c b/src/libserver/events.c index d94149584c..45ca50ce47 100644 --- a/src/libserver/events.c +++ b/src/libserver/events.c @@ -227,9 +227,7 @@ rspamd_session_destroy (struct rspamd_async_session *session) } session->flags |= RSPAMD_SESSION_FLAG_DESTROYING; - g_hash_table_foreach_remove (session->events, - rspamd_session_destroy_callback, - session); + rspamd_session_cleanup (session); if (session->cleanup != NULL) { session->cleanup (session->user_data); @@ -238,6 +236,19 @@ rspamd_session_destroy (struct rspamd_async_session *session) return TRUE; } +void +rspamd_session_cleanup (struct rspamd_async_session *session) +{ + if (session == NULL) { + msg_info_session ("session is NULL"); + return; + } + + g_hash_table_foreach_remove (session->events, + rspamd_session_destroy_callback, + session); +} + gboolean rspamd_session_pending (struct rspamd_async_session *session) { diff --git a/src/libserver/events.h b/src/libserver/events.h index 0126293973..cd748be0ae 100644 --- a/src/libserver/events.h +++ b/src/libserver/events.h @@ -75,6 +75,11 @@ void rspamd_session_remove_event (struct rspamd_async_session *session, */ gboolean rspamd_session_destroy (struct rspamd_async_session *session); +/** + * Try to remove all events pending + */ +void rspamd_session_cleanup (struct rspamd_async_session *session); + /** * Check session for events pending and call fin callback if no events are pending * @param session session object diff --git a/src/worker.c b/src/worker.c index 2598be415a..63cb778f45 100644 --- a/src/worker.c +++ b/src/worker.c @@ -129,7 +129,9 @@ rspamd_task_timeout (gint fd, short what, gpointer ud) if (!(task->processed_stages & RSPAMD_TASK_STAGE_FILTERS)) { msg_info_task ("processing of task timed out, forced processing"); task->processed_stages |= RSPAMD_TASK_STAGE_FILTERS; + rspamd_session_cleanup (task->s); rspamd_task_process (task, RSPAMD_TASK_PROCESS_ALL); + rspamd_session_pending (task->s); } } -- 2.47.3