• Andres Freund's avatar
    Clear all-frozen visibilitymap status when locking tuples. · eca0f1db
    Andres Freund authored
    Since a892234f & fd31cd26 the visibilitymap's freeze bit is used to
    avoid vacuuming the whole relation in anti-wraparound vacuums. Doing so
    correctly relies on not adding xids to the heap without also unsetting
    the visibilitymap flag.  Tuple locking related code has not done so.
    
    To allow selectively resetting all-frozen - to avoid pessimizing
    heap_lock_tuple - allow to selectively reset the all-frozen with
    visibilitymap_clear(). To avoid having to use
    visibilitymap_get_status (e.g. via VM_ALL_FROZEN) inside a critical
    section, have visibilitymap_clear() return whether any bits have been
    reset.
    
    There's a remaining issue (denoted by XXX): After the PageIsAllVisible()
    check in heap_lock_tuple() and heap_lock_updated_tuple_rec() the page
    status could theoretically change. Practically that currently seems
    impossible, because updaters will hold a page level pin already.  Due to
    the next beta coming up, it seems better to get the required WAL magic
    bump done before resolving this issue.
    
    The added flags field fields to xl_heap_lock and xl_heap_lock_updated
    require bumping the WAL magic. Since there's already been a catversion
    bump since the last beta, that's not an issue.
    
    Reviewed-By: Robert Haas, Amit Kapila and Andres Freund
    Author: Masahiko Sawada, heavily revised by Andres Freund
    Discussion: CAEepm=3fWAbWryVW9swHyLTY4sXVf0xbLvXqOwUoDiNCx9mBjQ@mail.gmail.com
    Backpatch: -
    eca0f1db
heapam_xlog.h 12.7 KB