]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Avoid double scheduling for maps
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 9 Dec 2017 15:54:01 +0000 (15:54 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 9 Dec 2017 15:54:01 +0000 (15:54 +0000)
src/libutil/map.c
src/libutil/map_private.h

index e2874f7e20060a3f07b3892c13f8a45c1f116803..0965201a8ea00a5b8add7f2417942ca8f09b5e19 100644 (file)
@@ -1053,6 +1053,11 @@ rspamd_map_schedule_periodic (struct rspamd_map *map,
        gdouble timeout;
        struct map_periodic_cbdata *cbd;
 
+       if (map->scheduled_check) {
+               /* Do not schedule check if some check is already scheduled */
+               return;
+       }
+
        if (map->next_check != 0) {
                timeout = map->next_check - rspamd_get_calendar_ticks ();
 
@@ -1098,6 +1103,7 @@ rspamd_map_schedule_periodic (struct rspamd_map *map,
        cbd->cbdata.cur_data = NULL;
        cbd->cbdata.map = map;
        cbd->map = map;
+       map->scheduled_check = TRUE;
        REF_INIT_RETAIN (cbd, rspamd_map_periodic_dtor);
 
        evtimer_set (&cbd->ev, rspamd_map_periodic_callback, cbd);
@@ -1531,6 +1537,7 @@ rspamd_map_periodic_callback (gint fd, short what, void *ud)
        struct rspamd_map *map;
 
        map = cbd->map;
+       map->scheduled_check = FALSE;
 
        if (!cbd->locked) {
                if (!g_atomic_int_compare_and_exchange (cbd->map->locked, 0, 1)) {
index 55641f3dd15cde30d50b87549ddbc99fc40660a5..fd2098cd1d4f7d85c976e4243f934e1570cbe917 100644 (file)
@@ -113,6 +113,7 @@ struct rspamd_map {
        gchar *description;
        gchar *name;
        guint32 id;
+       gboolean scheduled_check;
        /* Should we check HTTP or just load cached data */
        gboolean active_http;
        struct timeval tv;
@@ -142,8 +143,8 @@ struct map_periodic_cbdata {
        struct event ev;
        gboolean need_modify;
        gboolean errored;
-       guint cur_backend;
        gboolean locked;
+       guint cur_backend;
        ref_entry_t ref;
 };