pgsql: Guard against spurious signals in LockBufferForCleanup.

Поиск
Список
Период
Сортировка
От Andres Freund
Тема pgsql: Guard against spurious signals in LockBufferForCleanup.
Дата
Msg-id E1YPutW-0005ZO-UM@gemulon.postgresql.org
обсуждение исходный текст
Список pgsql-committers
Guard against spurious signals in LockBufferForCleanup.

When LockBufferForCleanup() has to wait for getting a cleanup lock on a
buffer it does so by setting a flag in the buffer header and then wait
for other backends to signal it using ProcWaitForSignal().
Unfortunately LockBufferForCleanup() missed that ProcWaitForSignal() can
return for other reasons than the signal it is hoping for. If such a
spurious signal arrives the wait flags on the buffer header will still
be set. That then triggers "ERROR: multiple backends attempting to wait
for pincount 1".

The fix is simple, unset the flag if still set when retrying. That
implies an additional spinlock acquisition/release, but that's unlikely
to matter given the cost of waiting for a cleanup lock.  Alternatively
it'd have been possible to move responsibility for maintaining the
relevant flag to the waiter all together, but that might have had
negative consequences due to possible floods of signals. Besides being
more invasive.

This looks to be a very longstanding bug. The relevant code in
LockBufferForCleanup() hasn't changed materially since its introduction
and ProcWaitForSignal() was documented to return for unrelated reasons
since 8.2.  The master only patch series removing ImmediateInterruptOK
made it much easier to hit though, as ProcSendSignal/ProcWaitForSignal
now uses a latch shared with other tasks.

Per discussion with Kevin Grittner, Tom Lane and me.

Backpatch to all supported branches.

Discussion: 11553.1423805224@sss.pgh.pa.us

Branch
------
REL9_0_STABLE

Details
-------
http://git.postgresql.org/pg/commitdiff/87b7fcc87277142f584a9c1646abe52a8a79365d

Modified Files
--------------
src/backend/storage/buffer/bufmgr.c |   14 ++++++++++++++
1 file changed, 14 insertions(+)


В списке pgsql-committers по дате отправления:

Предыдущее
От: Andres Freund
Дата:
Сообщение: pgsql: Guard against spurious signals in LockBufferForCleanup.
Следующее
От: Heikki Linnakangas
Дата:
Сообщение: pgsql: Refactor unit conversions code in guc.c.