]> git.ipfire.org Git - thirdparty/haproxy.git/commit
MAJOR: fd: get rid of the DWCAS when setting the running_mask
authorWilly Tarreau <w@1wt.eu>
Tue, 3 Aug 2021 07:04:32 +0000 (09:04 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 4 Aug 2021 14:03:36 +0000 (16:03 +0200)
commitf69fea64e02b12d343cc099fd18a417585519d76
treef2c972264154fed2353f795a07a4ecd386421af7
parentb1f29bc6252ffa6b43e2e210c4852dd9c3a1b1eb
MAJOR: fd: get rid of the DWCAS when setting the running_mask

Right now we're using a DWCAS to atomically set the running_mask while
being constrained by the thread_mask. This DWCAS is annoying because we
may seriously need it later when adding support for thread groups, for
checking that the running_mask applies to the correct group.

It turns out that the DWCAS is not strictly necessary because we never
need it to set the thread_mask based on the running_mask, only the other
way around. And in fact, the running_mask is always cleared alone, and
the thread_mask is changed alone as well. The running_mask is only
relevant to indicate a takeover when the thread_mask matches it. Any
bit set in running and not present in thread_mask indicates a transition
in progress.

As such, it is possible to re-arrange this by using a regular CAS around a
consistency check between running_mask and thread_mask in fd_update_events
and by making a CAS on running_mask then an atomic store on the thread_mask
in fd_takeover(). The only other case is fd_delete() but that one already
sets the running_mask before clearing the thread_mask, which is compatible
with the consistency check above.

This change has happily survived 10 billion takeovers on a 16-thread
machine at 800k requests/s.

The fd-migration doc was updated to reflect this change.
doc/internals/fd-migration.txt
include/haproxy/fd-t.h
src/fd.c