diff options
Diffstat (limited to 'src/backend/storage')
| -rw-r--r-- | src/backend/storage/ipc/procarray.c | 57 | ||||
| -rw-r--r-- | src/backend/storage/ipc/standby.c | 3 |
2 files changed, 58 insertions, 2 deletions
diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index 292e330367e..d357f52793e 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -1510,6 +1510,63 @@ GetRunningTransactionData(void) } /* + * GetOldestActiveTransactionId() + * + * Similar to GetSnapshotData but returns just oldestActiveXid. We include + * all PGPROCs with an assigned TransactionId, even VACUUM processes. + * We look at all databases, though there is no need to include WALSender + * since this has no effect on hot standby conflicts. + * + * This is never executed during recovery so there is no need to look at + * KnownAssignedXids. + * + * We don't worry about updating other counters, we want to keep this as + * simple as possible and leave GetSnapshotData() as the primary code for + * that bookkeeping. + */ +TransactionId +GetOldestActiveTransactionId(void) +{ + ProcArrayStruct *arrayP = procArray; + TransactionId oldestRunningXid; + int index; + + Assert(!RecoveryInProgress()); + + LWLockAcquire(ProcArrayLock, LW_SHARED); + + oldestRunningXid = ShmemVariableCache->nextXid; + + /* + * Spin over procArray collecting all xids and subxids. + */ + for (index = 0; index < arrayP->numProcs; index++) + { + volatile PGPROC *proc = arrayP->procs[index]; + TransactionId xid; + + /* Fetch xid just once - see GetNewTransactionId */ + xid = proc->xid; + + if (!TransactionIdIsNormal(xid)) + continue; + + if (TransactionIdPrecedes(xid, oldestRunningXid)) + oldestRunningXid = xid; + + /* + * Top-level XID of a transaction is always less than any of its + * subxids, so we don't need to check if any of the subxids are + * smaller than oldestRunningXid + */ + } + + LWLockRelease(ProcArrayLock); + + return oldestRunningXid; +} + +/* * GetTransactionsInCommit -- Get the XIDs of transactions that are committing * * Constructs an array of XIDs of transactions that are currently in commit diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c index e6b1fce61e6..64030b76d61 100644 --- a/src/backend/storage/ipc/standby.c +++ b/src/backend/storage/ipc/standby.c @@ -818,7 +818,7 @@ standby_desc(StringInfo buf, uint8 xl_info, char *rec) * making WAL entries. */ void -LogStandbySnapshot(TransactionId *oldestActiveXid, TransactionId *nextXid) +LogStandbySnapshot(TransactionId *nextXid) { RunningTransactions running; xl_standby_lock *locks; @@ -848,7 +848,6 @@ LogStandbySnapshot(TransactionId *oldestActiveXid, TransactionId *nextXid) /* GetRunningTransactionData() acquired XidGenLock, we must release it */ LWLockRelease(XidGenLock); - *oldestActiveXid = running->oldestRunningXid; *nextXid = running->nextXid; } |
