BROKEN/MEDIUM: listeners: rework the unbind logic to make it idempotent
authorWilly Tarreau <w@1wt.eu>
Thu, 8 Oct 2020 13:36:46 +0000 (15:36 +0200)
committerWilly Tarreau <w@1wt.eu>
Fri, 9 Oct 2020 16:29:04 +0000 (18:29 +0200)
commit87acd4e84815b6d7116ca28f45c8545eb7026169
treebe5d8e54e61db9970bf03dbeb0ab6fd73b32c1a1
parentd6afb53bdc252ec49d445f2530cad4e79fd4be57
BROKEN/MEDIUM: listeners: rework the unbind logic to make it idempotent

BROKEN: the failure rate on reg-tests/seamless-reload/abns_socket.vtc has
significantly increased for no obvious reason. It fails 99% of the time vs
10% before.

do_unbind_listener() is not logical and is not even idempotent. It must
not touch the fd if already -1, which also means not touch the receiver.
In addition, when performing a partial stop on a socket (not closing),
we know the socket remains in the listening state yet it's marked as
LI_ASSIGNED, which is confusing as it doesn't translate its real state.

With this change, we make sure that FDs marked for close end up in
ASSIGNED state and that those which are really bound and on which a
listen() was made (i.e. not pause) remain in LISTEN state. This is what
is closest to reality.

Ideally this function should become a default proto->unbind() one but
it may still keep a bit too much state logic to become generalized to
other protocols (e.g. QUIC).
src/listener.c