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: