]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: cli: Wait for the last ACK when FDs are xferred from the old worker
authorChristopher Faulet <cfaulet@haproxy.com>
Mon, 17 Feb 2025 14:16:15 +0000 (15:16 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Mon, 17 Feb 2025 14:31:07 +0000 (15:31 +0100)
On reload, the new worker requests bound FDs to the old one. The old worker
sends them in message of at most 252 FDs. Each message is acknowledged by
the new worker. All messages sent or received by the old worker are handled
manually via sendmsg/recv syscalls. So the old worker must be sure consume
all the ACK replies. However, the last one was never consumed. So it was
considered as a command by the CLI applet. This issue was hidden since
recently. But it was the root cause of the issue #2862.

Note this last ack is also the first one when there are less than 252 FDs to
transfer.

This patch must be backported to all stable versions.

src/cli.c

index 1b6c0cbc647dd2f5777e1da789d1221a459c6c9a..e7a33f57d41fb15d71d663179e86c7e076f3dd06 100644 (file)
--- a/src/cli.c
+++ b/src/cli.c
@@ -2444,6 +2444,16 @@ static int _getsocks(char **args, char *payload, struct appctx *appctx, void *pr
                        ha_warning("Failed to transfer sockets\n");
                        goto out;
                }
+
+               /* Wait for an ack */
+               do {
+                       ret = recv(fd, &tot_fd_nb, sizeof(tot_fd_nb), 0);
+               } while (ret == -1 && errno == EINTR);
+
+               if (ret <= 0) {
+                       ha_warning("Unexpected error while transferring sockets\n");
+                       goto out;
+               }
        }
 
 out: