pgsql: Make release of 2PC identifier and locks consistent in COMMITPR

Поиск
Список
Период
Сортировка
От Michael Paquier
Тема pgsql: Make release of 2PC identifier and locks consistent in COMMITPR
Дата
Msg-id E1gy8hf-0007Cv-FC@gemulon.postgresql.org
обсуждение исходный текст
Список 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 по дате отправления:

Предыдущее
От: Thomas Munro
Дата:
Сообщение: pgsql: Fix inconsistent out-of-memory error reporting in dsa.c.
Следующее
От: Peter Eisentraut
Дата:
Сообщение: pgsql: Remove unnecessary use of PROCEDURAL