Re: Condition variable live lock
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Thomas Munro <thomas.munro@enterprisedb.com>
Cc: Andres Freund <andres@anarazel.de>, Robert Haas <robertmhaas@gmail.com>,
Pg Hackers <pgsql-hackers@postgresql.org>
Date: 2018-01-05T19:38:37Z
Lists: pgsql-hackers
I wrote: > As I feared, the existing regression tests are not really adequate for > this: gcov testing shows that the sentinel-inserting code path is > never entered, meaning ConditionVariableBroadcast never sees more > than one waiter. Hmm ... adding tracing log printouts in BarrierArriveAndWait disproves that: the regression tests do, repeatedly, call ConditionVariableBroadcast when there are two waiters to be woken (and you can get it to be more if you raise the number of parallel workers specified in the PHJ tests). It just doesn't happen with --enable-coverage. Heisenberg wins again! I am not sure why coverage tracking changes the behavior so much, but it's clear from my results that if you change all the PHJ test cases in join.sql to use 4 parallel workers, then you get plenty of barrier release events with 4 or 5 barrier participants --- but running the identical test under --enable-coverage results in only a very small number of releases with even as many as 2 participants, let alone more. Perhaps the PHJ test cases don't run long enough to let slow-starting workers join in? Anyway, that may or may not indicate something we should tune at a higher level, but I'm now satisfied that the patch as presented works and does get tested by our existing tests. So barring objection I'll commit that shortly. There are some other things I don't like about condition_variable.c: * I think the Asserts in ConditionVariablePrepareToSleep and ConditionVariableSleep ought to be replaced by full-fledged test and elog(ERROR), so that they are enforced even in non-assert builds. I don't have a lot of confidence that corner cases that could violate those usage restrictions would get caught during developer testing. Nor do I see an argument that we can't afford the cycles to check. * ConditionVariablePrepareToSleep needs to be rearranged so that failure to create the WaitEventSet doesn't leave us in an invalid state. * A lot of the comments could be improved, IMHO. Barring objection I'll go deal with those things, too. regards, tom lane
Commits
-
Add WL_EXIT_ON_PM_DEATH pseudo-event.
- cfdf4dc4fc96 12.0 landed
-
While waiting for a condition variable, detect postmaster death.
- 80259d4dbf47 11.0 landed
- d56a5f994c21 10.2 landed
-
Fix race condition during replication origin drop.
- 8a906204aec4 11.0 landed
- 1f5adbd799cf 10.2 landed
-
Allow ConditionVariable[PrepareTo]Sleep to auto-switch between CVs.
- 4af2190eb04b 10.2 landed
- 13db3b936359 11.0 landed
-
Cosmetic improvements in condition_variable.[hc].
- e35dba475a44 11.0 landed
-
Improve error detection capability in proclists.
- ea8e1bbc5384 11.0 landed
-
Remove return values of ConditionVariableSignal/Broadcast.
- ccf312a4488a 11.0 landed
-
Reorder steps in ConditionVariablePrepareToSleep for more safety.
- 83fe2708d668 10.2 landed
- 3cac0ec85992 11.0 landed
-
Rewrite ConditionVariableBroadcast() to avoid live-lock.
- aced5a92bf46 11.0 landed
- 1c77e990833a 10.2 landed
-
Add parallel-aware hash joins.
- 1804284042e6 11.0 cited