Re: remove spurious CREATE INDEX CONCURRENTLY wait
Alvaro Herrera <alvherre@2ndquadrant.com>
From: Alvaro Herrera <alvherre@2ndquadrant.com>
To: James Coleman <jtc331@gmail.com>
Cc: Tom Lane <tgl@sss.pgh.pa.us>, Pg Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2020-08-19T18:16:46Z
Lists: pgsql-hackers
Attachments
On 2020-Aug-11, James Coleman wrote: > In [3] I'd brought up that a function index can do arbitrary > operations (including, terribly, a query of another table), and Andres > (in [4]) noted that: > > > Well, even if we consider this an actual problem, we could still use > > PROC_IN_CIC for non-expression non-partial indexes (index operator > > themselves better ensure this isn't a problem, or they're ridiculously > > broken already - they can get called during vacuum). > > But went on to describe how this is a problem with all expression > indexes (even if those expressions don't do dangerous things) because > of syscache lookups, but that ideally for expression indexes we'd have > a way to use a different (or more frequently taken) snapshot for the > purpose of computing those expressions. That's a significantly more > involved patch though. So the easy first patch here is to add the flag as PROC_IN_SAFE_CIC, which is set only for CIC when it's used for indexes that are neither on expressions nor partial. Then ignore those in WaitForOlderSnapshots. The attached patch does it that way. (Also updated per recent conflicts). I did not set the flag in REINDEX CONCURRENTLY, but as I understand it can be done too, since in essence it's the same thing as a CIC from a snapshot management point of view. Also, per [1], ISTM this flag could be used to tell lazy VACUUM to ignore the Xmin of this process too, which the previous formulation (where all CICs were so marked) could not. This patch doesn't do that yet, but it seems the natural next step to take. [1] https://postgr.es/m/20191101203310.GA12239@alvherre.pgsql -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
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