mirror of
https://github.com/postgres/postgres.git
synced 2025-11-04 20:11:56 +03:00
Avoid SnapshotResetXmin() during AtEOXact_Snapshot()
For normal commits and aborts we already reset PgXact->xmin Avoiding touching highly contented shmem improves concurrent performance. Simon Riggs Discussion: CANP8+jJdXE9b+b9F8CQT-LuxxO0PBCB-SZFfMVAdp+akqo4zfg@mail.gmail.com
This commit is contained in:
@@ -954,7 +954,12 @@ xmin_cmp(const pairingheap_node *a, const pairingheap_node *b, void *arg)
|
||||
*
|
||||
* If there are no more snapshots, we can reset our PGXACT->xmin to InvalidXid.
|
||||
* Note we can do this without locking because we assume that storing an Xid
|
||||
* is atomic.
|
||||
* is atomic. We do this because it will allow multi-statement transactions to
|
||||
* reset their xmin and prevent us from holding back removal of dead rows;
|
||||
* this has little purpose when we are dealing with very fast statements in
|
||||
* read committed mode since the xmin will advance quickly anyway. It has no
|
||||
* use at all when we are running single statement transactions since the xmin
|
||||
* is reset as part of end of transaction anyway.
|
||||
*
|
||||
* Even if there are some remaining snapshots, we may be able to advance our
|
||||
* PGXACT->xmin to some degree. This typically happens when a portal is
|
||||
@@ -1051,7 +1056,7 @@ AtSubAbort_Snapshot(int level)
|
||||
* Snapshot manager's cleanup function for end of transaction
|
||||
*/
|
||||
void
|
||||
AtEOXact_Snapshot(bool isCommit)
|
||||
AtEOXact_Snapshot(bool isCommit, bool isPrepare)
|
||||
{
|
||||
/*
|
||||
* In transaction-snapshot mode we must release our privately-managed
|
||||
@@ -1136,7 +1141,17 @@ AtEOXact_Snapshot(bool isCommit)
|
||||
|
||||
FirstSnapshotSet = false;
|
||||
|
||||
SnapshotResetXmin();
|
||||
/*
|
||||
* During normal commit and abort processing, we call
|
||||
* ProcArrayEndTransaction() or ProcArrayClearTransaction() to
|
||||
* reset the PgXact->xmin. That call happens prior to the call to
|
||||
* AtEOXact_Snapshot(), so we need not touch xmin here at all,
|
||||
* accept when we are preparing a transaction.
|
||||
*/
|
||||
if (isPrepare)
|
||||
SnapshotResetXmin();
|
||||
|
||||
Assert(MyPgXact->xmin == 0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user