• Andres Freund's avatar
    Do all-visible handling in lazy_vacuum_page() outside its critical section. · ecac0e2b
    Andres Freund authored
    Since fdf9e211 lazy_vacuum_page() rechecks the all-visible status
    of pages in the second pass over the heap. It does so inside a
    critical section, but both visibilitymap_test() and
    heap_page_is_all_visible() perform operations that should not happen
    inside one. The former potentially performs IO and both potentially do
    memory allocations.
    
    To fix, simply move all the all-visible handling outside the critical
    section. Doing so means that the PD_ALL_VISIBLE on the page won't be
    included in the full page image of the HEAP2_CLEAN record anymore. But
    that's fine, the flag will be set by the HEAP2_VISIBLE logged later.
    
    Backpatch to 9.3 where the problem was introduced. The bug only came
    to light due to the assertion added in 4a170ee9 and isn't likely to
    cause problems in production scenarios. The worst outcome is a
    avoidable PANIC restart.
    
    This also gets rid of the difference in the order of operations
    between master and standby mentioned in 2a8e1ac5.
    
    Per reports from David Leverton and Keith Fiske in bug #10533.
    ecac0e2b
vacuumlazy.c 55 KB