Re: Condition variable live lock
Thomas Munro <thomas.munro@enterprisedb.com>
From: Thomas Munro <thomas.munro@enterprisedb.com>
To: Pg Hackers <pgsql-hackers@postgresql.org>
Date: 2017-12-28T23:16:20Z
Lists: pgsql-hackers
Attachments
- fix-cv-livelock.patch (application/octet-stream) patch
On Fri, Dec 22, 2017 at 4:46 PM, Thomas Munro <thomas.munro@enterprisedb.com> wrote: > while (ConditionVariableSignal(cv)) > ++nwoken; > > The problem is that another backend can be woken up, determine that it > would like to wait for the condition variable again, and then get > itself added to the back of the wait queue *before the above loop has > finished*, so this interprocess ping-pong isn't guaranteed to > terminate. It seems that we'll need something slightly smarter than > the above to avoid that. Here is one way to fix it: track the wait queue size and use that number to limit the wakeup loop. See attached. That's unbackpatchable though, because it changes the size of struct ConditionVariable, potentially breaking extensions compiled against an earlier point release. Maybe this problem won't really cause problems in v10 anyway? It requires a particular interaction pattern that barrier.c produces but more typical client code might not: the awoken backends keep re-adding themselves because they're waiting for everyone (including the waker) to do something, but the waker is stuck in that broadcast loop. Thoughts? -- Thomas Munro http://www.enterprisedb.com
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