diff options
Diffstat (limited to 'src/backend/storage/ipc')
-rw-r--r-- | src/backend/storage/ipc/procarray.c | 18 | ||||
-rw-r--r-- | src/backend/storage/ipc/standby.c | 6 |
2 files changed, 18 insertions, 6 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; diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c index 671b00a33cf..a36eb80e9ae 100644 --- a/src/backend/storage/ipc/standby.c +++ b/src/backend/storage/ipc/standby.c @@ -1130,7 +1130,7 @@ standby_redo(XLogReaderState *record) running.xcnt = xlrec->xcnt; running.subxcnt = xlrec->subxcnt; - running.subxid_overflow = xlrec->subxid_overflow; + running.subxid_status = xlrec->subxid_overflow ? SUBXIDS_MISSING : SUBXIDS_IN_ARRAY; running.nextXid = xlrec->nextXid; running.latestCompletedXid = xlrec->latestCompletedXid; running.oldestRunningXid = xlrec->oldestRunningXid; @@ -1286,7 +1286,7 @@ LogCurrentRunningXacts(RunningTransactions CurrRunningXacts) xlrec.xcnt = CurrRunningXacts->xcnt; xlrec.subxcnt = CurrRunningXacts->subxcnt; - xlrec.subxid_overflow = CurrRunningXacts->subxid_overflow; + xlrec.subxid_overflow = (CurrRunningXacts->subxid_status != SUBXIDS_IN_ARRAY); xlrec.nextXid = CurrRunningXacts->nextXid; xlrec.oldestRunningXid = CurrRunningXacts->oldestRunningXid; xlrec.latestCompletedXid = CurrRunningXacts->latestCompletedXid; @@ -1303,7 +1303,7 @@ LogCurrentRunningXacts(RunningTransactions CurrRunningXacts) recptr = XLogInsert(RM_STANDBY_ID, XLOG_RUNNING_XACTS); - if (CurrRunningXacts->subxid_overflow) + if (xlrec.subxid_overflow) elog(trace_recovery(DEBUG2), "snapshot of %u running transactions overflowed (lsn %X/%X oldest xid %u latest complete %u next xid %u)", CurrRunningXacts->xcnt, |