• Andres Freund's avatar
    Centralize horizon determination for temp tables, fixing bug due to skew. · 94bc27b5
    Andres Freund authored
    This fixes a bug in the edge case where, for a temp table, heap_page_prune()
    can end up with a different horizon than heap_vacuum_rel(). Which can trigger
    errors like "ERROR: cannot freeze committed xmax ...".
    
    The bug was introduced due to interaction of a7212be8 "Set cutoff xmin more
    aggressively when vacuuming a temporary table." with dc7420c2 "snapshot
    scalability: Don't compute global horizons while building snapshots.".
    
    The problem is caused by lazy_scan_heap() assuming that the only reason its
    HeapTupleSatisfiesVacuum() call would return HEAPTUPLE_DEAD is if the tuple is
    a HOT tuple, or if the tuple's inserting transaction has aborted since the
    heap_page_prune() call. But after a7212be8 that was also possible in other
    cases for temp tables, because heap_page_prune() uses a different visibility
    test after dc7420c2.
    
    The fix is fairly simple: Move the special case logic for temp tables from
    vacuum_set_xid_limits() to the infrastructure introduced in dc7420c2. That
    ensures that the horizon used for pruning is at least as aggressive as the one
    used by lazy_scan_heap(). The concrete horizon used for temp tables is
    slightly different than the logic in dc7420c2, but should always be as
    aggressive as before (see comments).
    
    A significant benefit to centralizing the logic procarray.c is that now the
    more aggressive horizons for temp tables does not just apply to VACUUM but
    also to e.g. HOT pruning and the nbtree killtuples logic.
    
    Because isTopLevel is not needed by vacuum_set_xid_limits() anymore, I
    undid the the related changes from a7212be8.
    
    This commit also adds an isolation test ensuring that the more aggressive
    vacuuming and pruning of temp tables keeps working.
    Debugged-By: default avatarAmit Kapila <amit.kapila16@gmail.com>
    Debugged-By: default avatarTom Lane <tgl@sss.pgh.pa.us>
    Debugged-By: default avatarAshutosh Sharma <ashu.coek88@gmail.com>
    Author: Andres Freund <andres@anarazel.de>
    Discussion: https://postgr.es/m/20201014203103.72oke6hqywcyhx7s@alap3.anarazel.de
    Discussion: https://postgr.es/m/20201015083735.derdzysdtqdvxshp@alap3.anarazel.de
    94bc27b5
cluster.h 1.25 KB