diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2014-09-01 11:50:33 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2014-09-01 11:59:51 +0100 |
commit | c738d64d897f85359ea0b142ebb7f3b4ec39f69f (patch) | |
tree | 4a1aa0e3cf5ab155df4ea9679d5aa3f873c9b80a | |
parent | a509f5c41a762ce962171a8e3d5968ed14ee2c25 (diff) | |
download | rspamd-c738d64d897f85359ea0b142ebb7f3b4ec39f69f.tar.gz rspamd-c738d64d897f85359ea0b142ebb7f3b4ec39f69f.zip |
Improve maps jittering.
-rw-r--r-- | src/libutil/map.c | 45 |
1 files changed, 27 insertions, 18 deletions
diff --git a/src/libutil/map.c b/src/libutil/map.c index e459636ba..0612d7667 100644 --- a/src/libutil/map.c +++ b/src/libutil/map.c @@ -272,31 +272,45 @@ read_map_file (struct rspamd_map *map, struct file_map_data *data) *map->user_data = cbdata.cur_data; } -/** - * Common file callback - */ static void -file_callback (gint fd, short what, void *ud) +jitter_timeout_event (struct rspamd_map *map, gboolean locked) { - struct rspamd_map *map = ud; - struct file_map_data *data = map->map_data; - struct stat st; gdouble jittered_sec; /* Plan event again with jitter */ evtimer_del (&map->ev); - jittered_sec = - (map->cfg->map_timeout + g_random_double () * map->cfg->map_timeout); + jittered_sec = map->cfg->map_timeout; + if (locked) { + /* Add bigger jitter */ + jittered_sec += g_random_double () * map->cfg->map_timeout * 4; + } + else { + jittered_sec += g_random_double () * map->cfg->map_timeout; + } double_to_tv (jittered_sec, &map->tv); evtimer_add (&map->ev, &map->tv); +} + +/** + * Common file callback + */ +static void +file_callback (gint fd, short what, void *ud) +{ + struct rspamd_map *map = ud; + struct file_map_data *data = map->map_data; + struct stat st; if (g_atomic_int_get (map->locked)) { msg_info ( "don't try to reread map as it is locked by other process, will reread it later"); + jitter_timeout_event (map, TRUE); return; } + g_atomic_int_inc (map->locked); + jitter_timeout_event (map, FALSE); if (stat (data->filename, &st) != -1 && (st.st_mtime > data->st.st_mtime || data->st.st_mtime == -1)) { @@ -304,11 +318,13 @@ file_callback (gint fd, short what, void *ud) memcpy (&data->st, &st, sizeof (struct stat)); } else { + g_atomic_int_set (map->locked, 0); return; } msg_info ("rereading map file %s", data->filename); read_map_file (map, data); + g_atomic_int_set (map->locked, 0); } /** @@ -321,23 +337,16 @@ http_callback (gint fd, short what, void *ud) struct http_map_data *data = map->map_data; gint sock; struct http_callback_data *cbd; - gdouble jittered_sec; - - /* Plan event again with jitter */ - evtimer_del (&map->ev); - jittered_sec = - (map->cfg->map_timeout + g_random_double () * map->cfg->map_timeout); - double_to_tv (jittered_sec, &map->tv); - evtimer_add (&map->ev, &map->tv); if (g_atomic_int_get (map->locked)) { msg_info ( "don't try to reread map as it is locked by other process, will reread it later"); + jitter_timeout_event (map, TRUE); return; } g_atomic_int_inc (map->locked); - + jitter_timeout_event (map, FALSE); /* Connect asynced */ if ((sock = connect_http (map, data, TRUE)) == -1) { g_atomic_int_set (map->locked, 0); |