]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Project] Start to implement better revive strategy for upstreams
authorVsevolod Stakhov <vsevolod@rspamd.com>
Thu, 4 Sep 2025 15:58:40 +0000 (16:58 +0100)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Thu, 4 Sep 2025 15:58:40 +0000 (16:58 +0100)
src/libserver/fuzzy_backend/fuzzy_backend_redis.c
src/libutil/upstream.c

index f150d48befbc3da518280e59ef655620494cdf62..68a43ad903047866e33591a722058fd24614f61b 100644 (file)
@@ -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);
index 23d188dda1236f9ea3fbac81e15bd34dbb78d326..ea6bc9ad7116576375d23993db5a471bd558906a 100644 (file)
@@ -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);