mirror of
https://github.com/postgres/postgres.git
synced 2025-08-25 20:23:07 +03:00
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
This commit is contained in:
@@ -1210,6 +1210,11 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running)
|
||||
*/
|
||||
MaintainLatestCompletedXidRecovery(running->latestCompletedXid);
|
||||
|
||||
/*
|
||||
* NB: No need to increment ShmemVariableCache->xactCompletionCount here,
|
||||
* nobody can see it yet.
|
||||
*/
|
||||
|
||||
LWLockRelease(ProcArrayLock);
|
||||
|
||||
/* ShmemVariableCache->nextXid must be beyond any observed xid. */
|
||||
@@ -3915,6 +3920,9 @@ XidCacheRemoveRunningXids(TransactionId xid,
|
||||
/* Also advance global latestCompletedXid while holding the lock */
|
||||
MaintainLatestCompletedXid(latestXid);
|
||||
|
||||
/* ... and xactCompletionCount */
|
||||
ShmemVariableCache->xactCompletionCount++;
|
||||
|
||||
LWLockRelease(ProcArrayLock);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user