]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Extend task_timeout to postfilters stage
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 10 Aug 2019 13:42:33 +0000 (14:42 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 10 Aug 2019 13:42:33 +0000 (14:42 +0100)
src/controller.c
src/rspamd_proxy.c
src/worker.c

index bb8c67e6f1afe230ef64d1960ecf758918d16bda..108f558e0c351049248f3df6d04102be4e80c6c1 100644 (file)
@@ -2130,7 +2130,7 @@ rspamd_controller_handle_scan (struct rspamd_http_connection_entry *conn_ent,
        if (ctx->task_timeout > 0.0) {
                task->timeout_ev.data = task;
                ev_timer_init (&task->timeout_ev, rspamd_task_timeout,
-                               ctx->task_timeout, 0.0);
+                               ctx->task_timeout, ctx->task_timeout);
                ev_timer_start (task->event_loop, &task->timeout_ev);
        }
 
index 086dfd2c190ac7429b34d53b8b767182078912b0..6b1eec2377fa756833523040740a316b3c92564f 100644 (file)
@@ -1779,7 +1779,8 @@ rspamd_proxy_self_scan (struct rspamd_proxy_session *session)
        if (session->ctx->default_upstream->timeout > 0.0) {
                task->timeout_ev.data = task;
                ev_timer_init (&task->timeout_ev, rspamd_task_timeout,
-                               session->ctx->default_upstream->timeout, 0.0);
+                               session->ctx->default_upstream->timeout,
+                               session->ctx->default_upstream->timeout);
                ev_timer_start (task->event_loop, &task->timeout_ev);
 
        }
@@ -1787,7 +1788,8 @@ rspamd_proxy_self_scan (struct rspamd_proxy_session *session)
                if (session->ctx->cfg->task_timeout > 0) {
                        task->timeout_ev.data = task;
                        ev_timer_init (&task->timeout_ev, rspamd_task_timeout,
-                                       session->ctx->cfg->task_timeout, 0.0);
+                                       session->ctx->cfg->task_timeout,
+                                       session->ctx->default_upstream->timeout);
                        ev_timer_start (task->event_loop, &task->timeout_ev);
                }
        }
index 3a24f6c047224325328d1b923494366e906b1a09..59f7f6e9e2bd500f8132355cf6714e265fd5a7cb 100644 (file)
@@ -168,11 +168,47 @@ rspamd_task_timeout (EV_P_ ev_timer *w, int revents)
                        }
                }
 
+               ev_timer_again (EV_A_ w);
                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);
        }
+       else {
+               /* Postprocessing timeout */
+               msg_info_task ("post-processing of task time out: %.1f second spent; forced processing",
+                               ev_now (task->event_loop) - task->task_timestamp);
+
+               if (task->cfg->soft_reject_on_timeout) {
+                       struct rspamd_action *action, *soft_reject;
+
+                       action = rspamd_check_action_metric (task);
+
+                       if (action->action_type != METRIC_ACTION_REJECT) {
+                               soft_reject = rspamd_config_get_action_by_type (task->cfg,
+                                               METRIC_ACTION_SOFT_REJECT);
+                               rspamd_add_passthrough_result (task,
+                                               soft_reject,
+                                               0,
+                                               NAN,
+                                               "timeout post-processing message",
+                                               "task timeout",
+                                               0);
+
+                               ucl_object_replace_key (task->messages,
+                                               ucl_object_fromstring_common ("timeout post-processing message",
+                                                               0, UCL_STRING_RAW),
+                                               "smtp_message", 0,
+                                               false);
+                       }
+               }
+
+               ev_timer_stop (EV_A_ w);
+               task->processed_stages |= RSPAMD_TASK_STAGE_DONE;
+               rspamd_session_cleanup (task->s);
+               rspamd_task_process (task, RSPAMD_TASK_PROCESS_ALL);
+               rspamd_session_pending (task->s);
+       }
 }
 
 void
@@ -247,7 +283,8 @@ rspamd_worker_body_handler (struct rspamd_http_connection *conn,
        if (ctx->task_timeout > 0.0) {
                task->timeout_ev.data = task;
                ev_timer_init (&task->timeout_ev, rspamd_task_timeout,
-                               ctx->task_timeout, 0.0);
+                               ctx->task_timeout,
+                               ctx->task_timeout);
                ev_timer_start (task->event_loop, &task->timeout_ev);
        }