• Peter Geoghegan's avatar
    Fix undercounting in VACUUM VERBOSE output. · 73a076b0
    Peter Geoghegan authored
    The logic for determining how many nbtree pages in an index are deleted
    pages sometimes undercounted pages.  Pages that were deleted by the
    current VACUUM operation (as opposed to some previous VACUUM operation
    whose deleted pages have yet to be reused) were sometimes overlooked.
    The final count is exposed to users through VACUUM VERBOSE's "%u index
    pages have been deleted" output.
    
    btvacuumpage() avoided double-counting when _bt_pagedel() deleted more
    than one page by assuming that only one page was deleted, and that the
    additional deleted pages would get picked up during a future call to
    btvacuumpage() by the same VACUUM operation.  _bt_pagedel() can
    legitimately delete pages that the btvacuumscan() scan will not visit
    again, though, so that assumption was slightly faulty.
    
    Fix the accounting by teaching _bt_pagedel() about its caller's
    requirements.  It now only reports on pages that it knows btvacuumscan()
    won't visit again (including the current btvacuumpage() page), so
    everything works out in the end.
    
    This bug has been around forever.  Only backpatch to v11, though, to
    keep _bt_pagedel() is sync on the branches that have today's bugfix
    commit b0229f26.  Note that this commit changes the signature of
    _bt_pagedel(), just like commit b0229f26.
    
    Author: Peter Geoghegan
    Reviewed-By: Masahiko Sawada
    Discussion: https://postgr.es/m/CAH2-WzkrXBcMQWAYUJMFTTvzx_r4q=pYSjDe07JnUXhe+OZnJA@mail.gmail.com
    Backpatch: 11-
    73a076b0
nbtree.c 43.1 KB