Re: BUG #17255: Server crashes in index_delete_sort_cmp() due to race condition with vacuum
Peter Geoghegan <pg@bowt.ie>
From: Peter Geoghegan <pg@bowt.ie>
To: Andres Freund <andres@anarazel.de>
Cc: Dmitry Dolgov <9erthalion6@gmail.com>,
Alexander Lakhin <exclusion@gmail.com>, Matthias van de Meent <boekewurm+postgres@gmail.com>, PostgreSQL mailing lists <pgsql-bugs@lists.postgresql.org>
Date: 2021-12-11T22:51:35Z
Lists: pgsql-bugs
On Sat, Dec 11, 2021 at 2:03 PM Peter Geoghegan <pg@bowt.ie> wrote: > I have no objection to delaying the lazy_scan_heap_limits() stuff > until right before lazy_scan_heap() is called. However, I do think > that we should always know certain basic "immutable" facts about a > VACUUM at the point that we call lazy_scan_heap(), which is not the > case with this patch. > > Honestly, I'm surprised that you see much value in delaying the > lazy_scan_heap_limits() stuff until the very last microsecond. How > many microseconds could we possibly delay it by? Have you thought about the implications for the ongoing work to set pg_class.relfrozenxid to the oldest observed XID in the table, instead of just using FreezeLimit naively (which I've prototyped but haven't posted)? What if the target heap relation gets extended after we've established nblocks/rel_pages for the lazyvacuum.c operation (by calling RelationGetNumberOfBlocks()), but before we get to the lazy_scan_heap_limits() stuff for the same operation? What if there are a small number of heap pages at the end of the relation that we won't get to at all in the ongoing VACUUM? They could have heap tuples whose header XIDs are from just before our OldestXmin cutoff. I believe it follows that we cannot miss them (at least not in an aggressive VACUUM, maybe not ever with my patch). -- Peter Geoghegan
Commits
-
vacuumlazy.c: Standardize rel_pages terminology.
- e370f100f05d 15.0 landed
-
vacuumlazy.c: document vistest and OldestXmin.
- 73f6ec3d3c8d 15.0 landed
-
heap pruning: Only call BufferGetBlockNumber() once.
- c702d656a283 15.0 landed
-
Fix possible HOT corruption when RECENTLY_DEAD changes to DEAD while pruning.
- dad1539aec28 14.2 landed
- 18b87b201f73 15.0 landed
-
Assert redirect pointers are sensible after heap_page_prune().
- bb42bfb5ccb5 15.0 landed
-
Remove tupgone special case from vacuumlazy.c.
- 8523492d4e34 14.0 cited
-
Recycle nbtree pages deleted during same VACUUM.
- 9dd963ae2534 14.0 cited
-
snapshot scalability: Don't compute global horizons while building snapshots.
- dc7420c2c927 14.0 cited
-
Refactor heap_page_prune so that instead of changing item states on-the-fly,
- 6f10eb21118f 8.4.0 cited