From be7d3784b036dddaed2a2bf9aec8f870197aab48 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 17 Jun 2019 11:56:53 +0100 Subject: [PATCH] [Project] Utilize ev_stat in maps --- src/libutil/map.c | 41 ++++++++++++++++++++++++++++++--------- src/libutil/map.h | 2 +- src/libutil/map_private.h | 2 +- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/libutil/map.c b/src/libutil/map.c index ffb58f8c2..1b3419a17 100644 --- a/src/libutil/map.c +++ b/src/libutil/map.c @@ -1698,21 +1698,21 @@ rspamd_map_file_check_callback (struct map_periodic_cbdata *periodic) struct rspamd_map_backend *bk; map = periodic->map; - bk = g_ptr_array_index (map->backends, periodic->cur_backend); data = bk->data.fd; - if (!data->processed) { - /* File has never been read */ + if (!data->need_modify) { periodic->need_modify = TRUE; periodic->cur_backend = 0; + data->need_modify = FALSE; rspamd_map_process_periodic (periodic); return; } - /* Switch to the next backend */ + map = periodic->map; + /* Switch to the next backend as the rest is handled by ev_stat */ periodic->cur_backend ++; rspamd_map_process_periodic (periodic); } @@ -1759,9 +1759,6 @@ rspamd_map_file_read_callback (struct map_periodic_cbdata *periodic) if (!read_map_file (map, data, bk, periodic)) { periodic->errored = TRUE; } - else { - data->processed = TRUE; - } /* Switch to the next backend */ periodic->cur_backend ++; @@ -1876,21 +1873,34 @@ rspamd_map_process_periodic (struct map_periodic_cbdata *cbd) } } +static void +rspamd_map_on_stat (struct ev_loop *loop, ev_stat *w, int revents) +{ + struct rspamd_map *map = (struct rspamd_map *)w->data; + + msg_info_map ("old mtime is %t, new mtime is %t for map file %s", + w->prev.st_mtime, w->attr.st_mtime, w->path); + + rspamd_map_schedule_periodic (map, FALSE, TRUE, FALSE); +} + /* Start watching event for all maps */ void rspamd_map_watch (struct rspamd_config *cfg, - struct ev_loop *ev_base, + struct ev_loop *event_loop, struct rspamd_dns_resolver *resolver, struct rspamd_worker *worker, gboolean active_http) { GList *cur = cfg->maps; struct rspamd_map *map; + struct rspamd_map_backend *bk; + guint i; /* First of all do synced read of data */ while (cur) { map = cur->data; - map->event_loop = ev_base; + map->event_loop = event_loop; map->r = resolver; map->wrk = worker; @@ -1908,6 +1918,19 @@ rspamd_map_watch (struct rspamd_config *cfg, } } + PTR_ARRAY_FOREACH (map->backends, i, bk) { + if (bk->protocol == MAP_PROTO_FILE) { + struct file_map_data *data; + + data = bk->data.fd; + + ev_stat_init (&data->st_ev, rspamd_map_on_stat, + data->filename, map->poll_timeout * cfg->map_file_watch_multiplier); + data->st_ev.data = map; + ev_stat_start (event_loop, &data->st_ev); + } + } + rspamd_map_schedule_periodic (map, FALSE, TRUE, FALSE); cur = g_list_next (cur); diff --git a/src/libutil/map.h b/src/libutil/map.h index 365f2cb4c..9f04d4c6c 100644 --- a/src/libutil/map.h +++ b/src/libutil/map.h @@ -79,7 +79,7 @@ struct rspamd_map* rspamd_map_add_from_ucl (struct rspamd_config *cfg, * Start watching of maps by adding events to libevent event loop */ void rspamd_map_watch (struct rspamd_config *cfg, - struct ev_loop *ev_base, + struct ev_loop *event_loop, struct rspamd_dns_resolver *resolver, struct rspamd_worker *worker, gboolean active_http); diff --git a/src/libutil/map_private.h b/src/libutil/map_private.h index 71f05aee7..db5a72704 100644 --- a/src/libutil/map_private.h +++ b/src/libutil/map_private.h @@ -54,7 +54,7 @@ enum fetch_proto { */ struct file_map_data { gchar *filename; - gboolean processed; + gboolean need_modify; ev_stat st_ev; }; -- 2.39.5