aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2014-09-01 11:50:33 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2014-09-01 11:59:51 +0100
commitc738d64d897f85359ea0b142ebb7f3b4ec39f69f (patch)
tree4a1aa0e3cf5ab155df4ea9679d5aa3f873c9b80a
parenta509f5c41a762ce962171a8e3d5968ed14ee2c25 (diff)
downloadrspamd-c738d64d897f85359ea0b142ebb7f3b4ec39f69f.tar.gz
rspamd-c738d64d897f85359ea0b142ebb7f3b4ec39f69f.zip
Improve maps jittering.
-rw-r--r--src/libutil/map.c45
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);