• Alvaro Herrera's avatar
    Fix BRIN to use SnapshotAny during summarization · 2834855c
    Alvaro Herrera authored
    For correctness of summarization results, it is critical that the
    snapshot used during the summarization scan is able to see all tuples
    that are live to all transactions -- including tuples inserted or
    deleted by in-progress transactions.  Otherwise, it would be possible
    for a transaction to insert a tuple, then idle for a long time while a
    concurrent transaction executes summarization of the range: this would
    result in the inserted value not being considered in the summary.
    Previously we were trying to use a MVCC snapshot in conjunction with
    adding a "placeholder" tuple in the index: the snapshot would see all
    committed tuples, and the placeholder tuple would catch insertions by
    any new inserters.  The hole is that prior insertions by transactions
    that are still in progress by the time the MVCC snapshot was taken were
    ignored.
    
    Kevin Grittner reported this as a bogus error message during vacuum with
    default transaction isolation mode set to repeatable read (because the
    error report mentioned a function name not being invoked during), but
    the problem is larger than that.
    
    To fix, tweak IndexBuildHeapRangeScan to have a new mode that behaves
    the way we need using SnapshotAny visibility rules.  This change
    simplifies the BRIN code a bit, mainly by removing large comments that
    were mistaken.  Instead, rely on the SnapshotAny semantics to provide
    what it needs.  (The business about a placeholder tuple needs to remain:
    that covers the case that a transaction inserts a a tuple in a page that
    summarization already scanned.)
    
    Discussion: https://www.postgresql.org/message-id/20150731175700.GX2441@postgresql.org
    
    In passing, remove a couple of unused declarations from brin.h and
    reword a comment to be proper English.  This part submitted by Kevin
    Grittner.
    
    Backpatch to 9.5, where BRIN was introduced.
    2834855c
brin-1.spec 1.25 KB