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 */
msg_debug ("completed stage %d", st);
task->processed_stages |= st;
+ /* Reset checkpoint */
+ task->checkpoint = NULL;
+
/* Tail recursion */
return rspamd_task_process (task, stages);
}
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 */
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;
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;