]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: listener: also clear the error flag on a paused listener
authorWilly Tarreau <w@1wt.eu>
Tue, 10 Dec 2019 07:42:21 +0000 (08:42 +0100)
committerWilly Tarreau <w@1wt.eu>
Tue, 10 Dec 2019 09:43:31 +0000 (10:43 +0100)
When accept() fails because a listener is temporarily paused, the
FD might have both FD_POLL_HUP and FD_POLL_ERR bits set. While we do
not exploit FD_POLL_ERR here it's better to clear it because it is
reported on "show fd" and is confusing.

This may be backported to all versions.

src/listener.c

index fdb91ea38ebf9673eb8f597c567faffac37a519d..ed8b60fa7d4024214f43c6a7165b43b27f98be62 100644 (file)
@@ -793,13 +793,13 @@ void listener_accept(int fd)
                if (unlikely(cfd == -1)) {
                        switch (errno) {
                        case EAGAIN:
-                               if (fdtab[fd].ev & FD_POLL_HUP) {
+                               if (fdtab[fd].ev & (FD_POLL_HUP|FD_POLL_ERR)) {
                                        /* the listening socket might have been disabled in a shared
                                         * process and we're a collateral victim. We'll just pause for
                                         * a while in case it comes back. In the mean time, we need to
                                         * clear this sticky flag.
                                         */
-                                       _HA_ATOMIC_AND(&fdtab[fd].ev, ~FD_POLL_HUP);
+                                       _HA_ATOMIC_AND(&fdtab[fd].ev, ~(FD_POLL_HUP|FD_POLL_ERR));
                                        goto transient_error;
                                }
                                fd_cant_recv(fd);