• Peter Geoghegan's avatar
    Remove extra nbtree half-dead internal page check. · 3f58cc6d
    Peter Geoghegan authored
    It's not safe for nbtree VACUUM to attempt to delete a target page whose
    right sibling is already half-dead, since that would fail the
    cross-check when VACUUM attempts to re-find a downlink to the right
    sibling in the parent page.  Logic to prevent this from happening was
    added by commit 8da31837, which addressed a bug in the overhaul of
    page deletion that went into PostgreSQL 9.4 (commit efada2b8).
    VACUUM was made to check the right sibling page, and back off when it
    happened to be half-dead already.
    
    However, it is only truly necessary to do the right sibling check on the
    leaf level, since that transitively determines if the deletion target's
    parent's right sibling page is itself undergoing deletion.  Remove the
    internal page level check, and add a comment explaining why the leaf
    level check alone suffices.
    
    The extra check is also unnecessary due to the fact that internal pages
    that are marked half-dead are generally considered corrupt.  Commit
    efada2b8 established the principle that there should never be
    half-dead internal pages (internal pages pending deletion are possible,
    but that status is never directly represented in the internal page).
    VACUUM will complain about corruption when it encounters half-dead
    internal pages, so VACUUM is bound to raise an error one way or another
    when an nbtree index has a half-dead internal page (contrib/amcheck will
    also report that the page is corrupt).
    
    It's possible that a pg_upgrade'd 9.3 database will still have half-dead
    internal pages, so it may seem like there is an argument for leaving the
    check in place to reliably get a cleaner error message that advises the
    user to REINDEX.  However, leaf pages are also deleted in the first
    phase of deletion prior to PostgreSQL 9.4, so I believe we won't even
    attempt to re-find the parent page anyway (we won't have the fully
    deleted leaf page as the right sibling of our target page, so we won't
    even try to find a downlink for it).
    
    Discussion: https://postgr.es/m/CAH2-Wzm_ntmqJjWLRyKzimFmFvk+BnVAvUpaA4s1h9Ja58woaQ@mail.gmail.com
    3f58cc6d
README 43.2 KB