mirror of
https://github.com/postgres/postgres.git
synced 2025-11-25 12:03:53 +03:00
Track the oldest XID that can be safely looked up in CLOG.
This provides infrastructure for looking up arbitrary, user-supplied XIDs without a risk of scary-looking failures from within the clog module. Normally, the oldest XID that can be safely looked up in CLOG is the same as the oldest XID that can reused without causing wraparound, and the latter is already tracked. However, while truncation is in progress, the values are different, so we must keep track of them separately. Craig Ringer, reviewed by Simon Riggs and by me. Discussion: http://postgr.es/m/CAMsr+YHQiWNEi0daCTboS40T+V5s_+dst3PYv_8v2wNVH+Xx4g@mail.gmail.com
This commit is contained in:
@@ -259,7 +259,28 @@ ReadNewTransactionId(void)
|
||||
}
|
||||
|
||||
/*
|
||||
* Determine the last safe XID to allocate given the currently oldest
|
||||
* Advance the cluster-wide value for the oldest valid clog entry.
|
||||
*
|
||||
* We must acquire CLogTruncationLock to advance the oldestClogXid. It's not
|
||||
* necessary to hold the lock during the actual clog truncation, only when we
|
||||
* advance the limit, as code looking up arbitrary xids is required to hold
|
||||
* CLogTruncationLock from when it tests oldestClogXid through to when it
|
||||
* completes the clog lookup.
|
||||
*/
|
||||
void
|
||||
AdvanceOldestClogXid(TransactionId oldest_datfrozenxid)
|
||||
{
|
||||
LWLockAcquire(CLogTruncationLock, LW_EXCLUSIVE);
|
||||
if (TransactionIdPrecedes(ShmemVariableCache->oldestClogXid,
|
||||
oldest_datfrozenxid))
|
||||
{
|
||||
ShmemVariableCache->oldestClogXid = oldest_datfrozenxid;
|
||||
}
|
||||
LWLockRelease(CLogTruncationLock);
|
||||
}
|
||||
|
||||
/*
|
||||
* Determine the last safe XID to allocate using the currently oldest
|
||||
* datfrozenxid (ie, the oldest XID that might exist in any database
|
||||
* of our cluster), and the OID of the (or a) database with that value.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user