mirror of
https://github.com/postgres/postgres.git
synced 2025-11-25 12:03:53 +03:00
Relax lock level for setting PGPROC->statusFlags
We don't actually need a lock to set PGPROC->statusFlags itself; what we do need is a shared lock on either XidGenLock or ProcArrayLock in order to ensure MyProc->pgxactoff keeps still while we modify the mirror array in ProcGlobal->statusFlags. Some places were using an exclusive lock for that, which is excessive. Relax those to use shared lock only. procarray.c has a couple of places with somewhat brittle assumptions about PGPROC changes: ProcArrayEndTransaction uses only shared lock, so it's permissible to change MyProc only. On the other hand, ProcArrayEndTransactionInternal also changes other procs, so it must hold exclusive lock. Add asserts to ensure those assumptions continue to hold. Author: Álvaro Herrera <alvherre@alvh.no-ip.org> Reviewed-by: Michael Paquier <michael@paquier.xyz> Discussion: https://postgr.es/m/20201117155501.GA13805@alvherre.pgsql
This commit is contained in:
@@ -98,6 +98,11 @@ typedef enum
|
||||
* The semaphore and lock-activity fields in a prepared-xact PGPROC are unused,
|
||||
* but its myProcLocks[] lists are valid.
|
||||
*
|
||||
* We allow many fields of this struct to be accessed without locks, such as
|
||||
* statusFlags or delayChkpt. However, keep in mind that writing mirrored ones
|
||||
* (see below) requires holding ProcArrayLock or XidGenLock in at least shared
|
||||
* mode, so that pgxactoff does not change concurrently.
|
||||
*
|
||||
* Mirrored fields:
|
||||
*
|
||||
* Some fields in PGPROC (see "mirrored in ..." comment) are mirrored into an
|
||||
|
||||
Reference in New Issue
Block a user