haproxy/include/import
Willy Tarreau 9dd56da730 IMPORT: plock: give higher precedence to W than S
It was noticed in haproxy that in certain extreme cases, a write lock
subject to EBO may fail for a very long time in front of a large set
of readers constantly trying to upgrade to the S state. The reason is
that among many readers, one will succeed in its upgrade, and this
situation can last for a very long time with many readers upgrading
in turn, while the writer waits longer and longer before trying again.

Here we're taking a reasonable approach which is that the write lock
should have a higher precedence in its attempt to grab the lock. What
is done is that instead of fully rolling back in case of conflict with
a pure S lock, the writer will only release its read part in order to
let the S upgrade to W if needed, and finish its operations. This
guarantees no other seek/read/write can enter. Once the conflict is
resolved, the writer grabs the read part again and waits for readers
to be gone (in practice it could even return without waiting since we
know that any possible wanderers would leave or even not be there at
all, but it avoids a complicated loop code that wouldn't improve the
practical situation but inflate the code).

Thanks to this change, the maximum write lock latency on a 48 threads
AMD with aheavily loaded scheduler went down from 256 to 64 ms, and the
number of occurrences of 32ms or more was divided by 300, while all
occurrences of 1ms or less were multiplied by up to 3 (3 for the 4-16ns
cases).

This is plock commit b6a28366d156812f59c91346edc2eab6374a5ebd.
2025-02-07 18:04:29 +01:00
..
atomic-ops.h MAJOR: threads/plock: update the embedded library again 2023-08-11 19:03:35 +02:00
cebtree-prv.h BUILD: cebtree: silence a bogus gcc warning on impossible code paths 2024-09-18 17:42:52 +02:00
cebtree.h IMPORT: import cebtree (compact elastic binary trees) 2024-09-15 23:44:59 +02:00
cebu32_tree.h IMPORT: import cebtree (compact elastic binary trees) 2024-09-15 23:44:59 +02:00
cebu64_tree.h IMPORT: import cebtree (compact elastic binary trees) 2024-09-15 23:44:59 +02:00
cebua_tree.h IMPORT: import cebtree (compact elastic binary trees) 2024-09-15 23:44:59 +02:00
cebub_tree.h IMPORT: import cebtree (compact elastic binary trees) 2024-09-15 23:44:59 +02:00
cebuib_tree.h IMPORT: import cebtree (compact elastic binary trees) 2024-09-15 23:44:59 +02:00
cebuis_tree.h IMPORT: import cebtree (compact elastic binary trees) 2024-09-15 23:44:59 +02:00
cebul_tree.h IMPORT: import cebtree (compact elastic binary trees) 2024-09-15 23:44:59 +02:00
cebus_tree.h IMPORT: import cebtree (compact elastic binary trees) 2024-09-15 23:44:59 +02:00
eb32sctree.h REORG: ebtree: split structures into their own file ebtree-t.h 2021-10-07 01:41:14 +02:00
eb32tree.h REORG: ebtree: split structures into their own file ebtree-t.h 2021-10-07 01:41:14 +02:00
eb64tree.h REORG: ebtree: split structures into their own file ebtree-t.h 2021-10-07 01:41:14 +02:00
ebimtree.h BUG/MEDIUM: ebtree: use a byte-per-byte memcmp() to compare memory blocks 2020-06-16 11:30:33 +02:00
ebistree.h CLEANUP: assorted typo fixes in the code and comments 2024-09-03 17:49:21 +02:00
ebmbtree.h OPTIM: ebtree: make ebmb_insert_prefix() keep a copy the new node's key 2022-11-15 09:37:09 +01:00
ebpttree.h REORG: ebtree: split structures into their own file ebtree-t.h 2021-10-07 01:41:14 +02:00
ebsttree.h CLEANUP: assorted typo fixes in the code and comments 2024-09-03 17:49:21 +02:00
ebtree-t.h REORG: ebtree: split structures into their own file ebtree-t.h 2021-10-07 01:41:14 +02:00
ebtree.h IMPORT: ebtree: make string_equal_bits() return an unsigned 2024-01-06 13:35:42 +01:00
ist.h MINOR: ist: define iststrip() new function 2024-04-26 11:29:25 +02:00
lru.h REORG: ebtree: move the include files from ebtree to include/import/ 2020-06-11 09:31:11 +02:00
mjson.h MINOR: sample: converter: Add mjson library. 2021-04-15 17:05:38 +02:00
mt_list.h BUILD: import/mt_list: support building with TCC 2024-11-05 15:43:17 +01:00
plock.h IMPORT: plock: give higher precedence to W than S 2025-02-07 18:04:29 +01:00
sha1.h IMPORT: sha1: import SHA1 functions 2017-10-25 04:45:48 +02:00
slz-tables.h BUILD: tree-wide: fix a few missing includes in a few files 2024-03-05 11:50:34 +01:00
slz.h IMPORT: slz: implement a synchronous flush() operation 2023-06-30 16:12:36 +02:00
xxhash.h BUILD: xxhash: silence a build warning on Solaris + gcc-5.5 2024-04-17 09:43:32 +02:00