]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Minor] Allow to capture upstream object
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 13 Sep 2021 13:40:06 +0000 (14:40 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 13 Sep 2021 13:40:06 +0000 (14:40 +0100)
src/libserver/fuzzy_backend/fuzzy_backend_redis.c
src/libserver/redis_pool.cxx
src/libutil/upstream.c
src/libutil/upstream.h

index 75bb005d7e6527a09c78acbab0ef40a60a55eb4b..0de4875349be98d33bae3469002aac85a8e6e92e 100644 (file)
@@ -163,6 +163,7 @@ rspamd_fuzzy_redis_session_dtor (struct rspamd_fuzzy_redis_session *session,
        rspamd_fuzzy_redis_session_free_args (session);
 
        REF_RELEASE (session->backend);
+       rspamd_upstream_unref (session->up);
        g_free (session);
 }
 
@@ -678,7 +679,7 @@ rspamd_fuzzy_backend_check_redis (struct rspamd_fuzzy_backend *bk,
                        NULL,
                        0);
 
-       session->up = up;
+       session->up = rspamd_upstream_ref (up);
        addr = rspamd_upstream_addr_next (up);
        g_assert (addr != NULL);
        session->ctx = rspamd_redis_pool_connect (backend->pool,
@@ -818,7 +819,7 @@ rspamd_fuzzy_backend_count_redis (struct rspamd_fuzzy_backend *bk,
                        NULL,
                        0);
 
-       session->up = up;
+       session->up = rspamd_upstream_ref (up);
        addr = rspamd_upstream_addr_next (up);
        g_assert (addr != NULL);
        session->ctx = rspamd_redis_pool_connect (backend->pool,
@@ -956,7 +957,7 @@ rspamd_fuzzy_backend_version_redis (struct rspamd_fuzzy_backend *bk,
                        NULL,
                        0);
 
-       session->up = up;
+       session->up = rspamd_upstream_ref (up);
        addr = rspamd_upstream_addr_next (up);
        g_assert (addr != NULL);
        session->ctx = rspamd_redis_pool_connect (backend->pool,
@@ -1530,7 +1531,7 @@ rspamd_fuzzy_backend_update_redis (struct rspamd_fuzzy_backend *bk,
                        NULL,
                        0);
 
-       session->up = up;
+       session->up = rspamd_upstream_ref (up);
        addr = rspamd_upstream_addr_next (up);
        g_assert (addr != NULL);
        session->ctx = rspamd_redis_pool_connect (backend->pool,
index 896dc7750d3029edf1fadd7f7dcd918af7ba4b29..26b5f2f813c9b491e0ed9d7d0401b9de053656e3 100644 (file)
@@ -395,7 +395,8 @@ redis_pool_connection::redis_pool_connection(redis_pool *_pool,
 
        pool->register_context(ctx, this);
        ctx->data = this;
-       rspamd_random_hex((guchar *) tag, sizeof(tag));
+       memset(tag, 0, sizeof(tag));
+       rspamd_random_hex((guchar *)tag, sizeof(tag) - 1);
 
        redisLibevAttach(pool->event_loop, ctx);
        redisAsyncSetDisconnectCallback(ctx, redis_pool_connection::redis_on_disconnect);
index 889b524acf7c3348a272692dbba43cfab60cd8c6..98e766194ac355527b38f171f1a0408b8bc20142 100644 (file)
@@ -1714,3 +1714,16 @@ void rspamd_upstreams_add_watch_callback (struct upstream_list *ups,
 
        DL_APPEND (ups->watchers, nw);
 }
+
+struct upstream*
+rspamd_upstream_ref (struct upstream *up)
+{
+       REF_RETAIN (up);
+       return up;
+}
+
+void
+rspamd_upstream_unref (struct upstream *up)
+{
+       REF_RELEASE (up);
+}
index 89bcd9b5237daa609b12c75acfd33d00b6bf1bcf..72a768892965040a9ee6534af08d4a147af8f14b 100644 (file)
@@ -299,6 +299,18 @@ struct upstream *rspamd_upstream_get_except (struct upstream_list *ups,
  */
 void rspamd_upstream_reresolve (struct upstream_ctx *ctx);
 
+/**
+ * Share ownership on upstream
+ * @param up
+ * @return
+ */
+struct upstream* rspamd_upstream_ref (struct upstream *up);
+/**
+ * Unshare ownership on upstream
+ * @param up
+ */
+void rspamd_upstream_unref (struct upstream *up);
+
 #ifdef  __cplusplus
 }
 #endif