commit dbc9ff6: [Fix] Fix round-robin rotation

Vsevolod Stakhov vsevolod at highsecure.ru
Thu Feb 18 21:07:07 UTC 2021


Author: Vsevolod Stakhov
Date: 2021-02-18 21:00:56 +0000
URL: https://github.com/rspamd/rspamd/commit/dbc9ff655dfb459eb8af328a82a5b8c848cda480 (HEAD -> master)

[Fix] Fix round-robin rotation

---
 src/libutil/upstream.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/libutil/upstream.c b/src/libutil/upstream.c
index 6acf420ea..612354043 100644
--- a/src/libutil/upstream.c
+++ b/src/libutil/upstream.c
@@ -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 ++) {


More information about the Commits mailing list