]> granicus.if.org Git - postgresql/commit
Block signals while computing the sleep time in postmaster's main loop.
authorAndres Freund <andres@anarazel.de>
Wed, 1 Oct 2014 12:23:43 +0000 (14:23 +0200)
committerAndres Freund <andres@anarazel.de>
Wed, 1 Oct 2014 13:19:40 +0000 (15:19 +0200)
commita39e78b710eb588e102aedd2828611d7bc74714b
tree6a826fc6f840e8a2a0d3a11c1f69ad550ae4a46b
parent32984d8fc3dbb90a3fafb69fece0134f1ea790f9
Block signals while computing the sleep time in postmaster's main loop.

DetermineSleepTime() was previously called without blocked
signals. That's not good, because it allows signal handlers to
interrupt its workings.

DetermineSleepTime() was added in 9.3 with the addition of background
workers (da07a1e856511), where it only read from
BackgroundWorkerList.

Since 9.4, where dynamic background workers were added (7f7485a0cde),
the list is also manipulated in DetermineSleepTime(). That's bad
because the list now can be persistently corrupted if modified by both
a signal handler and DetermineSleepTime().

This was discovered during the investigation of hangs on buildfarm
member anole. It's unclear whether this bug is the source of these
hangs or not, but it's worth fixing either way. I have confirmed that
it can cause crashes.

It luckily looks like this only can cause problems when bgworkers are
actively used.

Discussion: 20140929193733.GB14400@awork2.anarazel.de

Backpatch to 9.3 where background workers were introduced.
src/backend/postmaster/postmaster.c