Thread: pgsql: Increment xactCompletionCount during subtransaction abort.

pgsql: Increment xactCompletionCount during subtransaction abort.

From
Andres Freund
Date:
Increment xactCompletionCount during subtransaction abort.

Snapshot caching, introduced in 623a9ba79b, 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

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/90c885cdab8bc5a5f12a243774fa0db51002a2fd

Modified Files
--------------
src/backend/storage/ipc/procarray.c |  8 +++++++
src/test/regress/expected/mvcc.out  | 42 +++++++++++++++++++++++++++++++++++
src/test/regress/parallel_schedule  |  2 +-
src/test/regress/serial_schedule    |  1 +
src/test/regress/sql/mvcc.sql       | 44 +++++++++++++++++++++++++++++++++++++
5 files changed, 96 insertions(+), 1 deletion(-)