]> source.dussan.org Git - rspamd.git/commitdiff
Add checkpoint to avoid endless iteration.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 2 Jun 2015 15:28:48 +0000 (16:28 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 2 Jun 2015 15:28:48 +0000 (16:28 +0100)
src/libserver/task.c
src/libserver/task.h
src/lua/lua_config.c

index 0f73c15f13312e9325b53879b20ee5e4315b673f..315732f97b3f990b9e8079c18f540273e662f0ae 100644 (file)
@@ -364,17 +364,25 @@ rspamd_process_filters (struct rspamd_task *task)
        gpointer item = NULL;
 
        /* Insert default metric to be sure that it exists all the time */
-       /* TODO: make preprocessing only once */
-       rspamd_create_metric_result (task, DEFAULT_METRIC);
-       if (task->settings) {
-               const ucl_object_t *wl;
-
-               wl = ucl_object_find_key (task->settings, "whitelist");
-               if (wl != NULL) {
-                       msg_info ("<%s> is whitelisted", task->message_id);
-                       task->flags |= RSPAMD_TASK_FLAG_SKIP;
-                       return TRUE;
+
+       if (task->checkpoint == NULL) {
+               rspamd_create_metric_result (task, DEFAULT_METRIC);
+               if (task->settings) {
+                       const ucl_object_t *wl;
+
+                       wl = ucl_object_find_key (task->settings, "whitelist");
+                       if (wl != NULL) {
+                               msg_info ("<%s> is whitelisted", task->message_id);
+                               task->flags |= RSPAMD_TASK_FLAG_SKIP;
+                               return TRUE;
+                       }
                }
+
+               task->checkpoint = GUINT_TO_POINTER (0x1);
+       }
+       else {
+               /* TODO: in future, we need to add dependencies here */
+               return TRUE;
        }
 
        /* Process metrics symbols */
@@ -462,6 +470,9 @@ rspamd_task_process (struct rspamd_task *task, guint stages)
                msg_debug ("completed stage %d", st);
                task->processed_stages |= st;
 
+               /* Reset checkpoint */
+               task->checkpoint = NULL;
+
                /* Tail recursion */
                return rspamd_task_process (task, stages);
        }
index 295ac76c39c3534b7d2c8f0f3b57731c6fc3ee5b..ae2c9eaa8e78908b9fab6f58d1da950a5c987aea 100644 (file)
@@ -168,7 +168,7 @@ struct rspamd_task {
        struct rspamd_dns_resolver *resolver;                       /**< DNS resolver                                                                   */
        struct event_base *ev_base;                                 /**< Event base                                                                             */
 
-       gpointer classify_data;                                                                         /**< Opaque classifiers data                                            */
+       gpointer checkpoint;                                                                            /**< Opaque checkpoint data                                             */
 
        struct {
                enum rspamd_metric_action action;                       /**< Action of pre filters                                                      */
index 8262f51eaf8dc168243702bed3a642fcd9032d54..d860f9daf7d266d13a53ba278a98b3f06bf0da7c 100644 (file)
@@ -517,6 +517,14 @@ rspamd_lua_call_post_filters (struct rspamd_task *task)
        struct rspamd_task **ptask;
        GList *cur;
 
+       if (task->checkpoint == NULL) {
+               task->checkpoint = GUINT_TO_POINTER (0x1);
+       }
+       else {
+               /* Do not process if done */
+               return;
+       }
+
        cur = task->cfg->post_filters;
        while (cur) {
                cd = cur->data;
@@ -577,6 +585,14 @@ rspamd_lua_call_pre_filters (struct rspamd_task *task)
        struct rspamd_task **ptask;
        GList *cur;
 
+       if (task->checkpoint == NULL) {
+               task->checkpoint = GUINT_TO_POINTER (0x1);
+       }
+       else {
+               /* Do not process if done */
+               return;
+       }
+
        cur = task->cfg->pre_filters;
        while (cur) {
                cd = cur->data;