]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Fix stats for redis backend
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 9 Jan 2016 21:24:41 +0000 (21:24 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 9 Jan 2016 21:24:41 +0000 (21:24 +0000)
src/libstat/backends/redis_backend.c
src/libstat/stat_config.c

index 21e441abc4b8d07afe755d165dec3664b10fdfb2..1c1690fc39a797acdf7f54bc19654553ed274724 100644 (file)
@@ -392,8 +392,11 @@ rspamd_redis_async_cbdata_cleanup (struct rspamd_redis_stat_cbdata *cbdata)
                        cbdata->elt->async->enabled = TRUE;
 
                        /* Replace ucl object */
-                       if (cbdata->elt->stat && cbdata->cur) {
-                               ucl_object_unref (cbdata->elt->stat);
+                       if (cbdata->cur) {
+                               if (cbdata->elt->stat) {
+                                       ucl_object_unref (cbdata->elt->stat);
+                               }
+
                                cbdata->elt->stat = cbdata->cur;
                                cbdata->cur = NULL;
                        }
@@ -414,7 +417,7 @@ rspamd_redis_stat_learns (redisAsyncContext *c, gpointer r, gpointer priv)
        struct rspamd_redis_stat_cbdata *cbdata = priv;
        redisReply *reply = r;
        ucl_object_t *obj;
-       gulong num;
+       gulong num = 0;
 
        cbdata->inflight --;
 
@@ -426,22 +429,10 @@ rspamd_redis_stat_learns (redisAsyncContext *c, gpointer r, gpointer priv)
                        rspamd_strtoul (reply->str, reply->len, &num);
                }
 
-               obj = (ucl_object_t *)ucl_object_find_key (cbdata->cur, "used");
-               if (obj) {
-                       obj->value.iv += num;
-               }
-
-               obj = (ucl_object_t *)ucl_object_find_key (cbdata->cur, "total");
+               obj = (ucl_object_t *)ucl_object_find_key (cbdata->cur, "revision");
                if (obj) {
                        obj->value.iv += num;
                }
-
-               obj = (ucl_object_t *)ucl_object_find_key (cbdata->cur, "size");
-               if (obj) {
-                       /* Size of key + size of int64_t */
-                       obj->value.iv += num * (sizeof (G_STRINGIFY (G_MAXINT64)) +
-                                       sizeof (guint64) + sizeof (gpointer));
-               }
        }
 
        if (cbdata->inflight == 0) {
@@ -456,7 +447,7 @@ rspamd_redis_stat_key (redisAsyncContext *c, gpointer r, gpointer priv)
        struct rspamd_redis_stat_cbdata *cbdata = priv;
        redisReply *reply = r;
        ucl_object_t *obj;
-       gulong num;
+       glong num = 0;
 
        cbdata->inflight --;
 
@@ -465,13 +456,30 @@ rspamd_redis_stat_key (redisAsyncContext *c, gpointer r, gpointer priv)
                        num = reply->integer;
                }
                else if (reply->type == REDIS_REPLY_STRING) {
-                       rspamd_strtoul (reply->str, reply->len, &num);
+                       rspamd_strtol (reply->str, reply->len, &num);
                }
 
-               obj = (ucl_object_t *)ucl_object_find_key (cbdata->cur, "revision");
+               if (num < 0) {
+                       msg_err ("bad learns count: %L", (gint64)num);
+                       num = 0;
+               }
+
+               obj = (ucl_object_t *)ucl_object_find_key (cbdata->cur, "used");
+               if (obj) {
+                       obj->value.iv += num;
+               }
+
+               obj = (ucl_object_t *)ucl_object_find_key (cbdata->cur, "total");
                if (obj) {
                        obj->value.iv += num;
                }
+
+               obj = (ucl_object_t *)ucl_object_find_key (cbdata->cur, "size");
+               if (obj) {
+                       /* Size of key + size of int64_t */
+                       obj->value.iv += num * (sizeof (G_STRINGIFY (G_MAXINT64)) +
+                                       sizeof (guint64) + sizeof (gpointer));
+               }
        }
 
        if (cbdata->inflight == 0) {
@@ -559,13 +567,15 @@ rspamd_redis_stat_keys (redisAsyncContext *c, gpointer r, gpointer priv)
 static void
 rspamd_redis_async_stat_cb (struct rspamd_stat_async_elt *elt, gpointer d)
 {
-       struct redis_stat_ctx *ctx = REDIS_CTX (d);
+       struct redis_stat_ctx *ctx;
        struct rspamd_redis_stat_elt *redis_elt = elt->ud;
        struct rspamd_redis_stat_cbdata *cbdata;
        rspamd_inet_addr_t *addr;
 
        g_assert (redis_elt != NULL);
 
+       ctx = redis_elt->ctx;
+
        if (redis_elt->cbdata) {
                /* We have some other process pending */
                rspamd_redis_async_cbdata_cleanup (redis_elt->cbdata);
@@ -657,7 +667,7 @@ rspamd_redis_connected (redisAsyncContext *c, gpointer r, gpointer priv)
        struct redis_stat_runtime *rt = REDIS_RUNTIME (priv);
        redisReply *reply = r;
        struct rspamd_task *task;
-       gulong val;
+       glong val = 0;
 
        task = rt->task;
 
@@ -667,8 +677,7 @@ rspamd_redis_connected (redisAsyncContext *c, gpointer r, gpointer priv)
                                rt->learned = reply->integer;
                        }
                        else if (reply->type == REDIS_REPLY_STRING) {
-                               rspamd_strtoul (reply->str, reply->len, &val);
-                               rt->learned = val;
+                               rspamd_strtol (reply->str, reply->len, &val);
                        }
                        else {
                                if (reply->type != REDIS_REPLY_NIL) {
@@ -676,9 +685,17 @@ rspamd_redis_connected (redisAsyncContext *c, gpointer r, gpointer priv)
                                                rt->stcf->symbol, reply->type);
                                }
 
-                               rt->learned = 0;
+                               val = 0;
+                       }
+
+                       if (val < 0) {
+                               msg_warn_task ("invalid number of learns for %s: %L",
+                                               rt->stcf->symbol, val);
+                               val = 0;
                        }
 
+                       rt->learned = val;
+
                        rt->conn_state = RSPAMD_REDIS_CONNECTED;
 
                        msg_debug_task ("connected to redis server, tokens learned for %s: %d",
index 9cdf6af8e7ee690a559cb89414cb97defb23fc4d..1c6989508a8ba7cfa7c6a729a642e266851c72a8 100644 (file)
@@ -372,8 +372,12 @@ rspamd_stat_ctx_register_async (rspamd_stat_async_handler handler,
 
        event_set (&elt->timer_ev, -1, EV_TIMEOUT, rspamd_async_elt_on_timer, elt);
        event_base_set (st_ctx->ev_base, &elt->timer_ev);
-       jittered_time = rspamd_time_jitter (elt->timeout, 0);
-       double_to_tv (jittered_time, &elt->tv);
+       /*
+        * First we set timeval to zero as we want cb to be executed as
+        * fast as possible
+        */
+       elt->tv.tv_sec = 0;
+       elt->tv.tv_usec = 0;
        event_add (&elt->timer_ev, &elt->tv);
 
        g_queue_push_tail (st_ctx->async_elts, elt);