]> git.ipfire.org Git - thirdparty/haproxy.git/commit
BUG/MAJOR: server: fix deadlock when changing maxconn via agent-check
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Fri, 18 Jun 2021 09:11:36 +0000 (11:11 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Tue, 22 Jun 2021 09:39:20 +0000 (11:39 +0200)
commit0274286dd3768c0d5e58588a1cb7e7e710fbc9d4
treed0fd82a903575fe95a1dda955c1f9749237a6cdd
parent7386668cbf7eba555d8b421f4360e9d4541c7e99
BUG/MAJOR: server: fix deadlock when changing maxconn via agent-check

The server_parse_maxconn_change_request locks the server lock. However,
this function can be called via agent-checks or lua code which already
lock it. This bug has been introduced by the following commit :

  commit 79a88ba3d09f7e2b73ae27cb5d24cc087a548fa6
  BUG/MAJOR: server: prevent deadlock when using 'set maxconn server'

This commit tried to fix another deadlock with can occur because
previoulsy server_parse_maxconn_change_request requires the server lock
to be held. However, it may call internally process_srv_queue which also
locks the server lock. The locking policy has thus been updated. The fix
is functional for the CLI 'set maxconn' but fails to address the
agent-check / lua counterparts.

This new issue is fixed in two steps :
- changes from the above commit have been reverted. This means that
  server_parse_maxconn_change_request must again be called with the
  server lock.

- to counter the deadlock fixed by the above commit, process_srv_queue
  now takes an argument to render the server locking optional if the
  caller already held it. This is only used by
  server_parse_maxconn_change_request.

The above commit was subject to backport up to 1.8. Thus this commit
must be backported in every release where it is already present.
include/haproxy/queue.h
include/haproxy/stream.h
src/backend.c
src/cli.c
src/queue.c
src/server.c
src/stream.c
src/tcpcheck.c