From 26f73dbcbb7ed87157c532f08d3a4bccea526834 Mon Sep 17 00:00:00 2001 From: Aurelien DARRAGON Date: Thu, 21 Sep 2023 20:24:14 +0200 Subject: [PATCH] MINOR: log/balance: support for the "sticky" lb algorithm sticky algorithm always tries to send log messages to the first server in the farm. The server will stay in front during queue and dequeue operations (no other server can steal its place), unless it becomes unavailable, in which case it will be replaced by another server from the tree. --- doc/configuration.txt | 6 ++++++ src/backend.c | 7 ++++++- src/log.c | 7 +++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/doc/configuration.txt b/doc/configuration.txt index 584d60423..6c903fcd5 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -8833,6 +8833,12 @@ log-balance [ ] fairest algorithm when the server's processing time remains equally distributed. + sticky The first server in the list of available servers receives all + the log messages. When the server goes DOWN, the next server + in the list takes its place. When a previously DOWN server + goes back UP it is added at the end of the list so that the + sticky server doesn't change until it becomes DOWN. + is an optional list of arguments which may be needed by some algorithms. diff --git a/src/backend.c b/src/backend.c index 190e95ee1..8b76a9343 100644 --- a/src/backend.c +++ b/src/backend.c @@ -2844,8 +2844,13 @@ int backend_parse_log_balance(const char **args, char **err, struct proxy *curpr curproxy->lbprm.algo &= ~BE_LB_ALGO; curproxy->lbprm.algo |= BE_LB_ALGO_RR; } + else if (strcmp(args[0], "sticky") == 0) { + curproxy->lbprm.algo &= ~BE_LB_ALGO; + /* we use ALGO_FAS as "sticky" mode in log-balance context */ + curproxy->lbprm.algo |= BE_LB_ALGO_FAS; + } else { - memprintf(err, "only supports 'roundrobin' option"); + memprintf(err, "only supports 'roundrobin', 'sticky' options"); return -1; } return 0; diff --git a/src/log.c b/src/log.c index 7f01ddf93..6900407a4 100644 --- a/src/log.c +++ b/src/log.c @@ -2109,6 +2109,13 @@ static inline void __do_send_log_backend(struct proxy *be, struct log_header hdr */ targetid = HA_ATOMIC_FETCH_ADD(&be->lbprm.log.lastid, 1) % nb_srv; } + else if ((be->lbprm.algo & BE_LB_ALGO) == BE_LB_ALGO_FAS) { + /* sticky mode: use first server in the pool, which will always stay + * first during dequeuing and requeuing, unless it becomes unavailable + * and will be replaced by another one + */ + targetid = 0; + } skip_lb: