• Andres Freund's avatar
    Increment xactCompletionCount during subtransaction abort. · 90c885cd
    Andres Freund authored
    Snapshot caching, introduced in 623a9ba7, did not increment
    xactCompletionCount during subtransaction abort. That could lead to an older
    snapshot being reused. That is, at least as far as I can see, not a
    correctness issue (for MVCC snapshots there's no difference between "in
    progress" and "aborted"). The only difference between the old and new
    snapshots would be a newer ->xmax.
    
    While HeapTupleSatisfiesMVCC makes the same visibility determination, reusing
    the old snapshot leads HeapTupleSatisfiesMVCC to not set
    HEAP_XMIN_INVALID. Which subsequently causes the kill_prior_tuple optimization
    to not kick in (via HeapTupleIsSurelyDead() returning false). The performance
    effects of doing the same index-lookups over and over again is how the issue
    was discovered...
    
    Fix the issue by incrementing xactCompletionCount in
    XidCacheRemoveRunningXids. It already acquires ProcArrayLock exclusively,
    making that an easy proposition.
    
    Add a test to ensure that kill_prior_tuple prevents index growth when it
    involves aborted subtransaction of the current transaction.
    
    Author: Andres Freund
    Discussion: https://postgr.es/m/20210406043521.lopeo7bbigad3n6t@alap3.anarazel.de
    Discussion: https://postgr.es/m/20210317055718.v6qs3ltzrformqoa%40alap3.anarazel.de
    90c885cd
serial_schedule 3.39 KB