BUG/MEDIUM: proto_udp/threads: recv() and send() must not be exclusive.
authorWilly Tarreau <w@1wt.eu>
Tue, 10 Dec 2019 17:12:04 +0000 (18:12 +0100)
committerWilly Tarreau <w@1wt.eu>
Tue, 10 Dec 2019 18:11:27 +0000 (19:11 +0100)
commit8e4a62508c4e2f6ba0ae01f552a13208a8018875
tree1f4bdd9f47f4120bee08c7bf53b14cec771fbd2d
parent3c0c292b491c9024bdb3fabaef90b3bb45aef273
BUG/MEDIUM: proto_udp/threads: recv() and send() must not be exclusive.

This is a complement to previous fix for bug #399. The exclusion between
the recv() and send() calls prevents send handlers from being called if
rx readiness is reported. The DNS code can trigger this situations with
threads where the fd_recv_ready() flag disappears between the test in
dgram_fd_handler() and the second test in dns_resolve_recv() while a
thread calls fd_cant_recv(), and this situation can sustain itself for
a while. With 8 threads and an error in the socket queue, placing a
printf on the return statement in dns_resolve_recv() scrolls very fast.

Simply removing the "else" in dgram_fd_handler() addresses the issue.

This fix must be backported as far as 1.6.

(cherry picked from commit d7f76a0a50f4ac6b32d2317c675b3752133ef6d2)
Signed-off-by: Willy Tarreau <w@1wt.eu>
src/proto_udp.c