• Peter Geoghegan's avatar
    Avoid update conflict out serialization anomalies. · 5940ffb2
    Peter Geoghegan authored
    SSI's HeapCheckForSerializableConflictOut() test failed to correctly
    handle conditions involving a concurrently inserted tuple which is later
    concurrently updated by a separate transaction .  A SELECT statement
    that called HeapCheckForSerializableConflictOut() could end up using the
    same XID (updater's XID) for both the original tuple, and the successor
    tuple, missing the XID of the xact that created the original tuple
    entirely.  This only happened when neither tuple from the chain was
    visible to the transaction's MVCC snapshot.
    
    The observable symptoms of this bug were subtle.  A pair of transactions
    could commit, with the later transaction failing to observe the effects
    of the earlier transaction (because of the confusion created by the
    update to the non-visible row).  This bug dates all the way back to
    commit dafaa3ef, which added SSI.
    
    To fix, make sure that we check the xmin of concurrently inserted tuples
    that happen to also have been updated concurrently.
    
    Author: Peter Geoghegan
    Reported-By: Kyle Kingsbury
    Reviewed-By: Thomas Munro
    Discussion: https://postgr.es/m/db7b729d-0226-d162-a126-8a8ab2dc4443@jepsen.io
    Backpatch: All supported versions
    5940ffb2
update-conflict-out.out 1.21 KB