• Alvaro Herrera's avatar
    Fix longstanding problems in VACUUM caused by untimely interruptions · e7ec0222
    Alvaro Herrera authored
    In VACUUM FULL, an interrupt after the initial transaction has been recorded
    as committed can cause postmaster to restart with the following error message:
    PANIC: cannot abort transaction NNNN, it was already committed
    This problem has been reported many times.
    
    In lazy VACUUM, an interrupt after the table has been truncated by
    lazy_truncate_heap causes other backends' relcache to still point to the
    removed pages; this can cause future INSERT and UPDATE queries to error out
    with the following error message:
    could not read block XX of relation 1663/NNN/MMMM: read only 0 of 8192 bytes
    The window to this race condition is extremely narrow, but it has been seen in
    the wild involving a cancelled autovacuum process.
    
    The solution for both problems is to inhibit interrupts in both operations
    until after the respective transactions have been committed.  It's not a
    complete solution, because the transaction could theoretically be aborted by
    some other error, but at least fixes the most common causes of both problems.
    e7ec0222
vacuum.h 5.75 KB