summaryrefslogtreecommitdiff
path: root/src/backend/storage/ipc/procarray.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/storage/ipc/procarray.c')
-rw-r--r--src/backend/storage/ipc/procarray.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c
index 4cfb22222b1..7eb431ed231 100644
--- a/src/backend/storage/ipc/procarray.c
+++ b/src/backend/storage/ipc/procarray.c
@@ -1099,7 +1099,7 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running)
* If the snapshot isn't overflowed or if its empty we can reset our
* pending state and use this snapshot instead.
*/
- if (!running->subxid_overflow || running->xcnt == 0)
+ if (running->subxid_status != SUBXIDS_MISSING || running->xcnt == 0)
{
/*
* If we have already collected known assigned xids, we need to
@@ -1251,7 +1251,7 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running)
* missing, so conservatively assume the last one is latestObservedXid.
* ----------
*/
- if (running->subxid_overflow)
+ if (running->subxid_status == SUBXIDS_MISSING)
{
standbyState = STANDBY_SNAPSHOT_PENDING;
@@ -1263,6 +1263,18 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running)
standbyState = STANDBY_SNAPSHOT_READY;
standbySnapshotPendingXmin = InvalidTransactionId;
+
+ /*
+ * If the 'xids' array didn't include all subtransactions, we have to
+ * mark any snapshots taken as overflowed.
+ */
+ if (running->subxid_status == SUBXIDS_IN_SUBTRANS)
+ procArray->lastOverflowedXid = latestObservedXid;
+ else
+ {
+ Assert(running->subxid_status == SUBXIDS_IN_ARRAY);
+ procArray->lastOverflowedXid = InvalidTransactionId;
+ }
}
/*
@@ -2897,7 +2909,7 @@ GetRunningTransactionData(void)
CurrentRunningXacts->xcnt = count - subcount;
CurrentRunningXacts->subxcnt = subcount;
- CurrentRunningXacts->subxid_overflow = suboverflowed;
+ CurrentRunningXacts->subxid_status = suboverflowed ? SUBXIDS_IN_SUBTRANS : SUBXIDS_IN_ARRAY;
CurrentRunningXacts->nextXid = XidFromFullTransactionId(ShmemVariableCache->nextXid);
CurrentRunningXacts->oldestRunningXid = oldestRunningXid;
CurrentRunningXacts->latestCompletedXid = latestCompletedXid;