aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstat/backends/redis_backend.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstat/backends/redis_backend.c')
-rw-r--r--src/libstat/backends/redis_backend.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/libstat/backends/redis_backend.c b/src/libstat/backends/redis_backend.c
index ae47eef9f..5fbb7f2da 100644
--- a/src/libstat/backends/redis_backend.c
+++ b/src/libstat/backends/redis_backend.c
@@ -84,6 +84,7 @@ struct rspamd_redis_stat_cbdata {
GPtrArray *cur_keys;
struct upstream *selected;
guint inflight;
+ gboolean wanna_die;
};
#define GET_TASK_ELT(task, elt) (task == NULL ? NULL : (task)->elt)
@@ -425,7 +426,9 @@ rspamd_redis_async_cbdata_cleanup (struct rspamd_redis_stat_cbdata *cbdata)
guint i;
gchar *k;
- if (cbdata) {
+ if (cbdata && !cbdata->wanna_die) {
+ /* Avoid double frees */
+ cbdata->wanna_die = TRUE;
redisAsyncFree (cbdata->redis);
for (i = 0; i < cbdata->cur_keys->len; i ++) {
@@ -468,6 +471,10 @@ rspamd_redis_stat_learns (redisAsyncContext *c, gpointer r, gpointer priv)
ucl_object_t *obj;
gulong num = 0;
+ if (cbdata->wanna_die) {
+ return;
+ }
+
cbdata->inflight --;
if (c->err == 0 && r != NULL) {
@@ -498,6 +505,10 @@ rspamd_redis_stat_key (redisAsyncContext *c, gpointer r, gpointer priv)
ucl_object_t *obj;
glong num = 0;
+ if (cbdata->wanna_die) {
+ return;
+ }
+
cbdata->inflight --;
if (c->err == 0 && r != NULL) {
@@ -545,6 +556,11 @@ rspamd_redis_stat_keys (redisAsyncContext *c, gpointer r, gpointer priv)
gchar **pk, *k;
guint i, processed = 0;
+
+ if (cbdata->wanna_die) {
+ return;
+ }
+
cbdata->inflight --;
if (c->err == 0 && r != NULL) {