From c132ade98b939ba6ec1753658dac2d1f20b8a441 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 4 Sep 2025 16:58:40 +0100 Subject: [PATCH] [Project] Start to implement better revive strategy for upstreams --- .../fuzzy_backend/fuzzy_backend_redis.c | 35 ++++++++++++++++++- src/libutil/upstream.c | 7 ++-- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/libserver/fuzzy_backend/fuzzy_backend_redis.c b/src/libserver/fuzzy_backend/fuzzy_backend_redis.c index f150d48bef..68a43ad903 100644 --- a/src/libserver/fuzzy_backend/fuzzy_backend_redis.c +++ b/src/libserver/fuzzy_backend/fuzzy_backend_redis.c @@ -119,7 +119,7 @@ rspamd_redis_get_servers(struct rspamd_fuzzy_backend_redis *ctx, char outbuf[8192]; lua_logger_out(L, -2, outbuf, sizeof(outbuf), - LUA_ESCAPE_UNPRINTABLE); + LUA_ESCAPE_UNPRINTABLE); msg_err("cannot get %s upstreams for Redis fuzzy storage %s; table content: %s", what, ctx->id, outbuf); @@ -689,6 +689,15 @@ void rspamd_fuzzy_backend_check_redis(struct rspamd_fuzzy_backend *bk, NULL, 0); + if (up == NULL) { + rspamd_fuzzy_redis_session_dtor(session, TRUE); + if (cb) { + memset(&rep, 0, sizeof(rep)); + cb(&rep, ud); + } + return; + } + session->up = rspamd_upstream_ref(up); addr = rspamd_upstream_addr_next(up); g_assert(addr != NULL); @@ -828,6 +837,14 @@ void rspamd_fuzzy_backend_count_redis(struct rspamd_fuzzy_backend *bk, NULL, 0); + if (up == NULL) { + rspamd_fuzzy_redis_session_dtor(session, TRUE); + if (cb) { + cb(0, ud); + } + return; + } + session->up = rspamd_upstream_ref(up); addr = rspamd_upstream_addr_next(up); g_assert(addr != NULL); @@ -966,6 +983,14 @@ void rspamd_fuzzy_backend_version_redis(struct rspamd_fuzzy_backend *bk, NULL, 0); + if (up == NULL) { + rspamd_fuzzy_redis_session_dtor(session, TRUE); + if (cb) { + cb(0, ud); + } + return; + } + session->up = rspamd_upstream_ref(up); addr = rspamd_upstream_addr_next(up); g_assert(addr != NULL); @@ -1538,6 +1563,14 @@ void rspamd_fuzzy_backend_update_redis(struct rspamd_fuzzy_backend *bk, NULL, 0); + if (up == NULL) { + rspamd_fuzzy_redis_session_dtor(session, TRUE); + if (cb) { + cb(FALSE, 0, 0, 0, 0, ud); + } + return; + } + session->up = rspamd_upstream_ref(up); addr = rspamd_upstream_addr_next(up); g_assert(addr != NULL); diff --git a/src/libutil/upstream.c b/src/libutil/upstream.c index 23d188dda1..ea6bc9ad71 100644 --- a/src/libutil/upstream.c +++ b/src/libutil/upstream.c @@ -1743,10 +1743,9 @@ rspamd_upstream_get_common(struct upstream_list *ups, RSPAMD_UPSTREAM_LOCK(ups); if (ups->alive->len == 0) { - /* We have no upstreams alive */ - msg_warn("there are no alive upstreams left for %s, revive all of them", - ups->ups_line); - g_ptr_array_foreach(ups->ups, rspamd_upstream_restore_cb, ups); + /* No alive upstreams; do not force-revive to avoid tight retry loops */ + RSPAMD_UPSTREAM_UNLOCK(ups); + return NULL; } RSPAMD_UPSTREAM_UNLOCK(ups); -- 2.47.3