pgsql: Make release of 2PC identifier and locks consistent in COMMITPR - Mailing list pgsql-committers

From Michael Paquier
Subject pgsql: Make release of 2PC identifier and locks consistent in COMMITPR
Date
Msg-id E1gy8hf-0007Cv-FC@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Make release of 2PC identifier and locks consistent in COMMIT PREPARED

When preparing a transaction in two-phase commit, a dummy PGPROC entry
holding the GID used for the transaction is registered, which gets
released once COMMIT PREPARED is run.  Prior releasing its shared memory
state, all the locks taken in the prepared transaction are released
using a dedicated set of callbacks (pgstat and multixact having similar
callbacks), which may cause the locks to be released before the GID is
set free.

Hence, there is a small window where lock conflicts could happen, for
example:
- Transaction A releases its locks, still holding its GID in shared
memory.
- Transaction B held a lock which conflicted with locks of transaction
A.
- Transaction B continues its processing, reusing the same GID as
transaction A.
- Transaction B fails because of a conflicting GID, already in use by
transaction A.

This commit changes the shared memory state release so as post-commit
callbacks and predicate lock cleanup happen consistently with the shared
memory state cleanup for the dummy PGPROC entry.  The race window is
small and 2PC had this issue from the start, so no backpatch is done.
On top if that fixes discussed involved ABI breakages, which are not
welcome in stable branches.

Reported-by: Oleksii Kliukin, Ildar Musin
Diagnosed-by: Oleksii Kliukin, Ildar Musin
Author: Michael Paquier
Reviewed-by: Masahiko Sawada, Oleksii Kliukin
Discussion: https://postgr.es/m/BF9B38A4-2BFF-46E8-BA87-A2D00A8047A6@hintbits.com

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/effe7d9552dd41fd6119404e39eecd2653cd966c

Modified Files
--------------
src/backend/access/transam/multixact.c |  6 ++---
src/backend/access/transam/twophase.c  | 47 ++++++++++++++++++++++++++--------
src/backend/storage/lmgr/lock.c        |  6 ++---
src/include/access/twophase.h          |  4 +--
4 files changed, 44 insertions(+), 19 deletions(-)


pgsql-committers by date:

Previous
From: Thomas Munro
Date:
Subject: pgsql: Fix inconsistent out-of-memory error reporting in dsa.c.
Next
From: Peter Eisentraut
Date:
Subject: pgsql: Remove unnecessary use of PROCEDURAL