BUG/MEDIUM: shctx: leave the block allocator when enough blocks are found
authorWilly Tarreau <w@1wt.eu>
Fri, 19 Nov 2021 16:29:23 +0000 (17:29 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Tue, 23 Nov 2021 15:34:07 +0000 (16:34 +0100)
commita148a38a82e7e823073231de1f82825c7af088cc
treebae8a9ac122ef1b243462010c62a4a72d9fc0dce
parent3b7f63a17a89c9390af2b53e1f1f37974fc7e151
BUG/MEDIUM: shctx: leave the block allocator when enough blocks are found

In shctx_row_reserve_hot(), a missing break allows the avail loop to
loop for a while after having allocated the required blocks, possibly
leading to the point where it could trigger the watchdog after checking
up to 2 million blocks. In addition, the extra iteration may leave one
block assigned with size zero at the head of the avail list, and mark
it as being an isolated chain of 1 block. It's unclear whether this
could have had other consequences.

There is a non-negligible chance that it addreses bugs #1451 and #1284,
as the pattern observed in the loop looks exactly the same as the one
reported there in the crashes.

It's only marked medium because it is extremely hard to trigger. Here
the conditions were reproduced when starting 4k connections at once
requesting objects of random sizes between 0 and 20k to store them into
a small 1MB cache. However the watchdog will never trigger in such a case
so one needs to instrument the functions.

Thanks to Sohaib Ahmad and @g0uZ for providing useful traces.

This will need to be backported to all stable branches.

(cherry picked from commit b15e8a1c96dc370e9c5d47463106b662f123c29e)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit ca4d7da1b15b865ce67b2d5912fa761a04366530)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
src/shctx.c