Work around deadlock problems with VACUUM FULL/CLUSTER on system catalogs,
Tom Lane <tgl@sss.pgh.pa.us>
Work around deadlock problems with VACUUM FULL/CLUSTER on system catalogs, as per my recent proposal. First, teach IndexBuildHeapScan to not wait for INSERT_IN_PROGRESS or DELETE_IN_PROGRESS tuples to commit unless the index build is checking uniqueness/exclusion constraints. If it isn't, there's no harm in just indexing the in-doubt tuple. Second, modify VACUUM FULL/CLUSTER to suppress reverifying uniqueness/exclusion constraint properties while rebuilding indexes of the target relation. This is reasonable because these commands aren't meant to deal with corrupted-data situations. Constraint properties will still be rechecked when an index is rebuilt by a REINDEX command. This gets us out of the problem that new-style VACUUM FULL would often wait for other transactions while holding exclusive lock on a system catalog, leading to probable deadlock because those other transactions need to look at the catalogs too. Although the real ultimate cause of the problem is a debatable choice to release locks early after modifying system catalogs, changing that choice would require pretty serious analysis and is not something to be undertaken lightly or on a tight schedule. The present patch fixes the problem in a fairly reasonable way and should also improve the speed of VACUUM FULL/CLUSTER a little bit.
Files
| Path | Change | +/− |
|---|---|---|
| src/backend/catalog/index.c | modified | +87 −56 |
| src/backend/commands/cluster.c | modified | +1 −2 |
| src/backend/commands/indexcmds.c | modified | +2 −2 |
| src/include/catalog/index.h | modified | +2 −2 |
| src/test/regress/parallel_schedule | modified | +2 −5 |