Re: remove spurious CREATE INDEX CONCURRENTLY wait
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Alvaro Herrera <alvherre@alvh.no-ip.org>
Cc: Andres Freund <andres@anarazel.de>, Michael Paquier <michael@paquier.xyz>,
Dmitry Dolgov <9erthalion6@gmail.com>,
James Coleman <jtc331@gmail.com>,
Pg Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2020-11-23T15:42:49Z
Lists: pgsql-hackers
Alvaro Herrera <alvherre@alvh.no-ip.org> writes: > PROC_IN_LOGICAL_DECODING: > Oddly enough, I think the reset of PROC_IN_LOGICAL_DECODING in > ReplicationSlotRelease might be the most problematic one of the lot. > That's because a proc's xmin that had been ignored all along by > ComputeXidHorizons, will now be included in the computation. Adding > asserts that proc->xmin and proc->xid are InvalidXid by the time we > reset the flag, I got hits in pg_basebackup, test_decoding and > subscription tests. I think it's OK for ComputeXidHorizons (since it > just means that a vacuum that reads a later will remove less rows.) But > in GetSnapshotData it is just not correct to have the Xmin go backwards. > Therefore it seems to me that this code has a bug independently of the > lock level used. That is only a bug if the flags are *cleared* in a way that's not atomic with clearing the transaction's xid/xmin, no? I agree that once set, the flag had better stay set till transaction end, but that's not what's at stake here. > GetCurrentVirtualXIDs, ComputeXidHorizons, GetSnapshotData: > In these cases, what we need is that the code computes some xmin (or > equivalent computation) based on a set of transactions that exclude > those marked with the flags. The behavior we want is that if some > transaction is marked as vacuum, we ignore the Xid/Xmin *if there is > one*. In other words, if there's no Xid/Xmin, then the flag is not > important. So if we can ensure that the flag is set first, and the > Xid/xmin is installed later, that's sufficient correctness and we don't > need to hold exclusive lock. But if we can't ensure that, then we must > use exclusive lock, because otherwise we risk another process seeing our > Xid first and not our flag, which would be bad. I don't buy this either. You get the same result if someone looks just before you take the ProcArrayLock to set the flag. So if there's a problem, it's inherent in the way that the flags are defined or used; the strength of lock used in this stanza won't affect it. regards, tom lane
Commits
-
Restore lock level to set vacuum flags
- 9aa91cb33b70 14.2 landed
- 0726c764bc4e 15.0 landed
-
Restore lock level to update statusFlags
- dcfff74fb166 14.0 landed
-
Avoid spurious waits in concurrent indexing
- c98763bf51bf 14.0 landed
-
Centralize logic for skipping useless ereport/elog calls.
- 789b938bf2b8 14.0 landed
-
Don't hold ProcArrayLock longer than needed in rare cases
- 450c8230b1f7 14.0 landed
-
Relax lock level for setting PGPROC->statusFlags
- 27838981be9d 14.0 landed
-
Rename PGPROC->vacuumFlags to statusFlags
- cd9c1b3e197a 14.0 landed
-
snapshot scalability: Move PGXACT->vacuumFlags to ProcGlobal->vacuumFlags.
- 5788e258bb26 14.0 cited
-
Allow an autovacuum worker to be interrupted automatically when it is found
- acac68b2bcae 8.3.0 cited