]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Fix round-robin rotation
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 18 Feb 2021 21:00:56 +0000 (21:00 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 18 Feb 2021 21:00:56 +0000 (21:00 +0000)
src/libutil/upstream.c

index 6acf420ea1ccca859d152e4d4762473712784310..6123540434fc3b626a62e4763b61fbba8dbc3be3 100644 (file)
@@ -1378,13 +1378,20 @@ rspamd_upstream_get_round_robin (struct upstream_list *ups,
                        }
                }
 
-               if (up->checked * (up->errors + 1) < min_checked) {
+               /*
+                * This code is used when all upstreams have zero weight
+                * The logic is to select least currently used upstream and penalise
+                * upstream with errors. The error penalty should no be too high
+                * to avoid sudden traffic drop in this case.
+                */
+               if (up->checked + up->errors * 2 < min_checked) {
                        min_checked_sel = up;
                        min_checked = up->checked;
                }
        }
 
        if (max_weight == 0) {
+               /* All upstreams have zero weight */
                if (min_checked > G_MAXUINT / 2) {
                        /* Reset all checked counters to avoid overflow */
                        for (i = 0; i < ups->alive->len; i ++) {