From 9bacec15b67d1a643915858f054790f36b2b7871 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Tue, 2 Nov 2021 12:06:17 -0700 Subject: Don't overlook indexes during parallel VACUUM. Commit b4af70cb, which simplified state managed by VACUUM, performed refactoring of parallel VACUUM in passing. Confusion about the exact details of the tasks that the leader process is responsible for led to code that made it possible for parallel VACUUM to miss a subset of the table's indexes entirely. Specifically, indexes that fell under the min_parallel_index_scan_size size cutoff were missed. These indexes are supposed to be vacuumed by the leader (alongside any parallel unsafe indexes), but weren't vacuumed at all. Affected indexes could easily end up with duplicate heap TIDs, once heap TIDs were recycled for new heap tuples. This had generic symptoms that might be seen with almost any index corruption involving structural inconsistencies between an index and its table. To fix, make sure that the parallel VACUUM leader process performs any required index vacuuming for indexes that happen to be below the size cutoff. Also document the design of parallel VACUUM with these below-size-cutoff indexes. It's unclear how many users might be affected by this bug. There had to be at least three indexes on the table to hit the bug: a smaller index, plus at least two additional indexes that themselves exceed the size cutoff. Cases with just one additional index would not run into trouble, since the parallel VACUUM cost model requires two larger-than-cutoff indexes on the table to apply any parallel processing. Note also that autovacuum was not affected, since it never uses parallel processing. Test case based on tests from a larger patch to test parallel VACUUM by Masahiko Sawada. Many thanks to Kamigishi Rei for her invaluable help with tracking this problem down. Author: Peter Geoghegan Author: Masahiko Sawada Reported-By: Kamigishi Rei Reported-By: Andrew Gierth Diagnosed-By: Andres Freund Bug: #17245 Discussion: https://postgr.es/m/17245-ddf06aaf85735f36@postgresql.org Discussion: https://postgr.es/m/20211030023740.qbnsl2xaoh2grq3d@alap3.anarazel.de Backpatch: 14-, where the refactoring commit appears. --- src/include/commands/vacuum.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/include/commands') diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bf3126aa9bb..4cfd52eaf4d 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -40,7 +40,7 @@ /* * bulkdelete can be performed in parallel. This option can be used by - * IndexAm's that need to scan the index to delete the tuples. + * index AMs that need to scan indexes to delete tuples. */ #define VACUUM_OPTION_PARALLEL_BULKDEL (1 << 0) -- cgit v1.2.3