Hi, On 2021-06-10 17:49:05 +0200, Matthias van de Meent wrote: > Apart from this, I'm also quite certain that the goto-branch that > created this infinite loop should have been dead code: In a correctly > working system, the GlobalVis*Rels should always be at least as strict > as the vacrel->OldestXmin, but at the same time only GlobalVis*Rels > can be updated (i.e. move their horizon forward) during the vacuum. As > such, heap_prune_satisfies_vacuum should never fail to vacuum a tuple > that also satisifies the condition of HeapTupleSatisfiesVacuum. That > is, unless we're also going to change code to update / move forward > vacrel->OldestXmin in lazy_scan_prune between the HPSV call and the > loop with HTSV.
Consider the case of a transaction that inserted a row aborting. That tuple will be "fully dead" regardless of any xid horizons. Greetings, Andres Freund