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 18:11:26 +0000 (19:11 +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.

(cherry picked from commit 20aeb1c7cd38907d704a4d769695b9ea264fa4c0)
Signed-off-by: Willy Tarreau <w@1wt.eu>

src/listener.c

index fdb91ea..ed8b60f 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);