]> git.ipfire.org Git - thirdparty/haproxy.git/commit
BUG/MEDIUM: checks: fix a race condition between checks and observe layer7
authorWilly Tarreau <w@1wt.eu>
Tue, 12 Feb 2013 14:23:12 +0000 (15:23 +0100)
committerWilly Tarreau <w@1wt.eu>
Tue, 12 Feb 2013 15:04:47 +0000 (16:04 +0100)
commit5ba04f6cf94651ce77c8b1059ff033a0c6f112af
tree0195190e867c34a2e3f049c5a600d2332eb027ce
parent6cbbdbf3f363711b2264565763bf1b6c6a7af012
BUG/MEDIUM: checks: fix a race condition between checks and observe layer7

When observe layer7 is enabled on a server, a response may cause a server
to be marked down while a check is in progress. When the check finally
completes, the connection is not properly released in process_chk() because
the server states makes it think that no check was in progress due to the
lastly reported failure.

When a new check gets scheduled, it reuses the same connection structure
which is reinitialized. When the server finally closes the previous
connection, epoll_wait() notifies conn_fd_handler() which sees that the
old connection is still referenced by fdtab[fd], but it can not do anything
with this fd which does not match conn->t.sock.fd. So epoll_wait() keeps
reporting this fd forever.

The solution is to always make process_chk() always take care of closing
the connection and not make it rely on the connection layer to so.

Special thanks go to James Cole and Finn Arne Gangstad who encountered
the issue almost at the same time and took care of reporting a very
detailed analysis with rich information to help understand the issue.
src/checks.c