• Heikki Linnakangas's avatar
    Don't update relfrozenxid if any pages were skipped. · 82b43f7d
    Heikki Linnakangas authored
    Vacuum recognizes that it can update relfrozenxid by checking whether it has
    processed all pages of a relation. Unfortunately it performed that check
    after truncating the dead pages at the end of the relation, and used the new
    number of pages to decide whether all pages have been scanned. If the new
    number of pages happened to be smaller or equal to the number of pages
    scanned, it incorrectly decided that all pages were scanned.
    
    This can lead to relfrozenxid being updated, even though some pages were
    skipped that still contain old XIDs. That can lead to data loss due to xid
    wraparounds with some rows suddenly missing. This likely has escaped notice
    so far because it takes a large number (~2^31) of xids being used to see the
    effect, while a full-table vacuum before that would fix the issue.
    
    The incorrect logic was introduced by commit
    b4b6923e. Backpatch this fix down to 8.4,
    like that commit.
    
    Andres Freund, with some modifications by me.
    82b43f7d
vacuumlazy.c 53.3 KB