pgsql: Fix issues around the "variable" support in the lwlock infrastru

From: Andres Freund <andres(at)anarazel(dot)de>
To: pgsql-committers(at)postgresql(dot)org
Subject: pgsql: Fix issues around the "variable" support in the lwlock infrastru
Date: 2015-08-02 16:51:18
Message-ID: E1ZLwTm-0005Nu-GM@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Fix issues around the "variable" support in the lwlock infrastructure.

The lwlock scalability work introduced two race conditions into the
lwlock variable support provided for xlog.c. First, and harmlessly on
most platforms, it set/read the variable without the spinlock in some
places. Secondly, due to the removal of the spinlock, it was possible
that a backend missed changes to the variable's state if it changed in
the wrong moment because checking the lock's state, the variable's state
and the queuing are not protected by a single spinlock acquisition
anymore.

To fix first move resetting the variable's from LWLockAcquireWithVar to
WALInsertLockRelease, via a new function LWLockReleaseClearVar. That
prevents issues around waiting for a variable's value to change when a
new locker has acquired the lock, but not yet set the value. Secondly
re-check that the variable hasn't changed after enqueing, that prevents
the issue that the lock has been released and already re-acquired by the
time the woken up backend checks for the lock's state.

Reported-By: Jeff Janes
Analyzed-By: Heikki Linnakangas
Reviewed-By: Heikki Linnakangas
Discussion: 5592DB35(dot)2060401(at)iki(dot)fi
Backpatch: 9.5, where the lwlock scalability went in

Branch
------
REL9_5_STABLE

Details
-------
http://git.postgresql.org/pg/commitdiff/27b719173516b54df63a1bba4266798e9f77bbb9

Modified Files
--------------
src/backend/access/transam/xlog.c | 34 ++++---
src/backend/storage/lmgr/lwlock.c | 193 +++++++++++++++++++++----------------
src/include/storage/lwlock.h | 2 +-
3 files changed, 129 insertions(+), 100 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Heikki Linnakangas 2015-08-02 17:11:53 pgsql: Fix race condition that lead to WALInsertLock deadlock with comm
Previous Message Andres Freund 2015-08-02 16:51:15 pgsql: Fix issues around the "variable" support in the lwlock infrastru