While fixing the backup server round-robin "feature", a new bug was introduced
which could miss some backup servers.
diff --git a/haproxy.c b/haproxy.c
index 67dce3d..d03ec1f 100644
--- a/haproxy.c
+++ b/haproxy.c
@@ -1787,17 +1787,21 @@
*/
static inline struct server *find_server(struct proxy *px) {
struct server *srv = px->cursrv;
+ struct server *end;
int ignore_backup = 1;
do {
+ if (srv == NULL)
+ srv = px->srv;
+ end = srv;
do {
- if (srv == NULL)
- srv = px->srv;
if (srv->state & SRV_RUNNING
&& !((srv->state & SRV_BACKUP) && ignore_backup))
return srv;
srv = srv->next;
- } while (srv != px->cursrv);
+ if (srv == NULL)
+ srv = px->srv;
+ } while (srv != end);
/* By default, we look for the first backup server if all others are
* DOWN. But in some cases, it may be desirable to load-balance across