aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/storage/ipc/procarray.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c
index 2e54c11f880..e5b945a9ee3 100644
--- a/src/backend/storage/ipc/procarray.c
+++ b/src/backend/storage/ipc/procarray.c
@@ -4497,9 +4497,23 @@ ExpireTreeKnownAssignedTransactionIds(TransactionId xid, int nsubxids,
void
ExpireAllKnownAssignedTransactionIds(void)
{
+ FullTransactionId latestXid;
+
LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE);
KnownAssignedXidsRemovePreceding(InvalidTransactionId);
+ /* Reset latestCompletedXid to nextXid - 1 */
+ Assert(FullTransactionIdIsValid(TransamVariables->nextXid));
+ latestXid = TransamVariables->nextXid;
+ FullTransactionIdRetreat(&latestXid);
+ TransamVariables->latestCompletedXid = latestXid;
+
+ /*
+ * Any transactions that were in-progress were effectively aborted, so
+ * advance xactCompletionCount.
+ */
+ TransamVariables->xactCompletionCount++;
+
/*
* Reset lastOverflowedXid. Currently, lastOverflowedXid has no use after
* the call of this function. But do this for unification with what
@@ -4517,8 +4531,18 @@ ExpireAllKnownAssignedTransactionIds(void)
void
ExpireOldKnownAssignedTransactionIds(TransactionId xid)
{
+ TransactionId latestXid;
+
LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE);
+ /* As in ProcArrayEndTransaction, advance latestCompletedXid */
+ latestXid = xid;
+ TransactionIdRetreat(latestXid);
+ MaintainLatestCompletedXidRecovery(latestXid);
+
+ /* ... and xactCompletionCount */
+ TransamVariables->xactCompletionCount++;
+
/*
* Reset lastOverflowedXid if we know all transactions that have been
* possibly running are being gone. Not doing so could cause an incorrect