aboutsummaryrefslogtreecommitdiffstats
path: root/src/libutil
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2019-06-17 13:24:30 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2019-06-22 10:57:29 +0100
commitde721b490bce9f95385ab451da1190f934cf3425 (patch)
tree5e0184459e623adc67e18f6791543b16a00bec7c /src/libutil
parent005105a1b0e0b8101ad641f892609c680af2f45f (diff)
downloadrspamd-de721b490bce9f95385ab451da1190f934cf3425.tar.gz
rspamd-de721b490bce9f95385ab451da1190f934cf3425.zip
[Project] Fix usage of periodic events
Diffstat (limited to 'src/libutil')
-rw-r--r--src/libutil/http_context.c19
-rw-r--r--src/libutil/http_private.h2
-rw-r--r--src/libutil/map.c25
-rw-r--r--src/libutil/map_private.h3
4 files changed, 29 insertions, 20 deletions
diff --git a/src/libutil/http_context.c b/src/libutil/http_context.c
index 3f7f86910..95ab7021c 100644
--- a/src/libutil/http_context.c
+++ b/src/libutil/http_context.c
@@ -65,19 +65,16 @@ rspamd_http_keepalive_queue_cleanup (GQueue *conns)
}
static void
-rspamd_http_context_client_rotate_ev (struct ev_loop *loop, ev_periodic *w, int revents)
+rspamd_http_context_client_rotate_ev (struct ev_loop *loop, ev_timer *w, int revents)
{
- struct timeval rot_tv;
struct rspamd_http_context *ctx = (struct rspamd_http_context *)w->data;
gpointer kp;
- double_to_tv (ctx->config.client_key_rotate_time, &rot_tv);
- rot_tv.tv_sec += ottery_rand_range (rot_tv.tv_sec);
+ w->repeat = rspamd_time_jitter (ctx->config.client_key_rotate_time, 0);
+ msg_debug_http_context ("rotate local keypair, next rotate in %.0f seconds",
+ w->repeat);
- msg_debug_http_context ("rotate local keypair, next rotate in %d seconds",
- (int)rot_tv.tv_sec);
-
- ev_periodic_again (loop, w);
+ ev_timer_again (loop, w);
kp = ctx->client_kp;
ctx->client_kp = rspamd_keypair_new (RSPAMD_KEYPAIR_KEX,
@@ -190,9 +187,9 @@ rspamd_http_context_init (struct rspamd_http_context *ctx)
double jittered = rspamd_time_jitter (ctx->config.client_key_rotate_time,
0);
- ev_periodic_init (&ctx->client_rotate_ev,
- rspamd_http_context_client_rotate_ev, 0.0, jittered, NULL);
- ev_periodic_start (ctx->event_loop, &ctx->client_rotate_ev);
+ ev_timer_init (&ctx->client_rotate_ev,
+ rspamd_http_context_client_rotate_ev, jittered, 0);
+ ev_timer_start (ctx->event_loop, &ctx->client_rotate_ev);
ctx->client_rotate_ev.data = ctx;
}
diff --git a/src/libutil/http_private.h b/src/libutil/http_private.h
index e09dbef40..f5a7dd9cc 100644
--- a/src/libutil/http_private.h
+++ b/src/libutil/http_private.h
@@ -101,7 +101,7 @@ struct rspamd_http_context {
gpointer ssl_ctx;
gpointer ssl_ctx_noverify;
struct ev_loop *event_loop;
- ev_periodic client_rotate_ev;
+ ev_timer client_rotate_ev;
khash_t (rspamd_keep_alive_hash) *keep_alive_hash;
};
diff --git a/src/libutil/map.c b/src/libutil/map.c
index 1b3419a17..3d9c84ea7 100644
--- a/src/libutil/map.c
+++ b/src/libutil/map.c
@@ -330,7 +330,7 @@ http_map_error (struct rspamd_http_connection *conn,
}
static void
-rspamd_map_cache_cb (struct ev_loop *loop, ev_periodic *w, int revents)
+rspamd_map_cache_cb (struct ev_loop *loop, ev_timer *w, int revents)
{
struct rspamd_http_map_cached_cbdata *cache_cbd = (struct rspamd_http_map_cached_cbdata *)
w->data;
@@ -340,8 +340,6 @@ rspamd_map_cache_cb (struct ev_loop *loop, ev_periodic *w, int revents)
map = cache_cbd->map;
data = cache_cbd->data;
- ev_periodic_stop (loop, &cache_cbd->timeout);
-
if (cache_cbd->gen != cache_cbd->data->gen) {
/* We have another update, so this cache element is obviously expired */
/*
@@ -351,6 +349,7 @@ rspamd_map_cache_cb (struct ev_loop *loop, ev_periodic *w, int revents)
msg_info_map ("cached data is now expired (gen mismatch %L != %L) for %s",
cache_cbd->gen, cache_cbd->data->gen, map->name);
MAP_RELEASE (cache_cbd->shm, "rspamd_http_map_cached_cbdata");
+ ev_timer_stop (loop, &cache_cbd->timeout);
g_free (cache_cbd);
}
else if (cache_cbd->data->last_checked >= cache_cbd->last_checked) {
@@ -358,15 +357,25 @@ rspamd_map_cache_cb (struct ev_loop *loop, ev_periodic *w, int revents)
* We checked map but we have not found anything more recent,
* reschedule cache check
*/
+ if (cache_cbd->map->poll_timeout >
+ ev_now (loop) - cache_cbd->data->last_checked) {
+ w->repeat = cache_cbd->map->poll_timeout -
+ (ev_now (loop) - cache_cbd->data->last_checked);
+ }
+ else {
+ w->repeat = cache_cbd->map->poll_timeout;
+ }
+
cache_cbd->last_checked = cache_cbd->data->last_checked;
msg_debug_map ("cached data is up to date for %s", map->name);
- ev_periodic_again (loop, &cache_cbd->timeout);
+ ev_timer_again (loop, &cache_cbd->timeout);
}
else {
data->cur_cache_cbd = NULL;
g_atomic_int_set (&data->cache->available, 0);
MAP_RELEASE (cache_cbd->shm, "rspamd_http_map_cached_cbdata");
msg_info_map ("cached data is now expired for %s", map->name);
+ ev_timer_stop (loop, &cache_cbd->timeout);
g_free (cache_cbd);
}
}
@@ -675,14 +684,16 @@ read_data:
data->cache->last_modified = cbd->data->last_modified;
cache_cbd = g_malloc0 (sizeof (*cache_cbd));
cache_cbd->shm = cbd->shmem_data;
+ cache_cbd->event_loop = cbd->event_loop;
cache_cbd->map = map;
cache_cbd->data = cbd->data;
cache_cbd->last_checked = cbd->data->last_checked;
cache_cbd->gen = cbd->data->gen;
MAP_RETAIN (cache_cbd->shm, "shmem_data");
- ev_periodic_set (&cache_cbd->timeout, 0.0, cached_timeout, NULL);
- ev_periodic_start (cbd->event_loop, &cache_cbd->timeout);
+ ev_timer_init (&cache_cbd->timeout, rspamd_map_cache_cb, cached_timeout,
+ 0.0);
+ ev_timer_start (cbd->event_loop, &cache_cbd->timeout);
cache_cbd->timeout.data = cache_cbd;
data->cur_cache_cbd = cache_cbd;
@@ -2258,7 +2269,7 @@ rspamd_map_backend_dtor (struct rspamd_map_backend *bk)
if (data->cur_cache_cbd) {
MAP_RELEASE (data->cur_cache_cbd->shm,
"rspamd_http_map_cached_cbdata");
- ev_periodic_stop (ev_default_loop (0),
+ ev_timer_stop (data->cur_cache_cbd->event_loop,
&data->cur_cache_cbd->timeout);
g_free (data->cur_cache_cbd);
data->cur_cache_cbd = NULL;
diff --git a/src/libutil/map_private.h b/src/libutil/map_private.h
index db5a72704..455919d15 100644
--- a/src/libutil/map_private.h
+++ b/src/libutil/map_private.h
@@ -62,7 +62,8 @@ struct file_map_data {
struct http_map_data;
struct rspamd_http_map_cached_cbdata {
- ev_periodic timeout;
+ ev_timer timeout;
+ struct ev_loop *event_loop;
struct rspamd_storage_shmem *shm;
struct rspamd_map *map;
struct http_map_data *data;