BUG/MINOR: listener: also clear the error flag on a paused listener

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.
This commit is contained in:
Willy Tarreau 2019-12-10 08:42:21 +01:00
parent 7cdeb61701
commit 20aeb1c7cd

View File

@ -793,13 +793,13 @@ void listener_accept(int fd)
if (unlikely(cfd == -1)) { if (unlikely(cfd == -1)) {
switch (errno) { switch (errno) {
case EAGAIN: 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 /* the listening socket might have been disabled in a shared
* process and we're a collateral victim. We'll just pause for * 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 * a while in case it comes back. In the mean time, we need to
* clear this sticky flag. * 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; goto transient_error;
} }
fd_cant_recv(fd); fd_cant_recv(fd);