From e89fc350172a710d97eb301d8dfc9a9667610ed3 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 13 Sep 2021 14:40:06 +0100 Subject: [PATCH] [Minor] Allow to capture upstream object --- src/libserver/fuzzy_backend/fuzzy_backend_redis.c | 9 +++++---- src/libserver/redis_pool.cxx | 3 ++- src/libutil/upstream.c | 13 +++++++++++++ src/libutil/upstream.h | 12 ++++++++++++ 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/libserver/fuzzy_backend/fuzzy_backend_redis.c b/src/libserver/fuzzy_backend/fuzzy_backend_redis.c index 75bb005d7..0de487534 100644 --- a/src/libserver/fuzzy_backend/fuzzy_backend_redis.c +++ b/src/libserver/fuzzy_backend/fuzzy_backend_redis.c @@ -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, diff --git a/src/libserver/redis_pool.cxx b/src/libserver/redis_pool.cxx index 896dc7750..26b5f2f81 100644 --- a/src/libserver/redis_pool.cxx +++ b/src/libserver/redis_pool.cxx @@ -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); diff --git a/src/libutil/upstream.c b/src/libutil/upstream.c index 889b524ac..98e766194 100644 --- a/src/libutil/upstream.c +++ b/src/libutil/upstream.c @@ -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); +} diff --git a/src/libutil/upstream.h b/src/libutil/upstream.h index 89bcd9b52..72a768892 100644 --- a/src/libutil/upstream.h +++ b/src/libutil/upstream.h @@ -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 -- 2.39.5