• T
    Fix a longstanding bug in VACUUM FULL's handling of update chains. The code · d3ff1801
    Tom Lane 提交于
    did not expect that a DEAD tuple could follow a RECENTLY_DEAD tuple in an
    update chain, but because the OldestXmin rule for determining deadness is a
    simplification of reality, it is possible for this situation to occur
    (implying that the RECENTLY_DEAD tuple is in fact dead to all observers,
    but this patch does not attempt to exploit that).  The code would follow a
    chain forward all the way, but then stop before a DEAD tuple when backing
    up, meaning that not all of the chain got moved.  This could lead to copying
    the chain multiple times (resulting in duplicate copies of the live tuple at
    its end), or leaving dangling index entries behind (which, aside from
    generating warnings from later vacuums, creates a risk of wrong query
    results or bogus duplicate-key errors once the heap slot the index entry
    points to is repopulated).
    
    The fix is to recheck HeapTupleSatisfiesVacuum while following a chain
    forward, and to stop if a DEAD tuple is reached.  Each contiguous group
    of RECENTLY_DEAD tuples will therefore be copied as a separate chain.
    The patch also adds a couple of extra sanity checks to verify correct
    behavior.
    
    Per report and test case from Pavan Deolasee.
    d3ff1801
vacuum.c 101.9 KB