mirror of
https://github.com/postgres/postgres.git
synced 2025-11-15 03:41:20 +03:00
Logging running transactions every 15 seconds.
Previously, we did this just once per checkpoint, but that could make Hot Standby take a long time to initialize. To avoid busying an otherwise-idle system, we don't do this if no WAL has been written since we did it last. Andres Freund
This commit is contained in:
@@ -42,7 +42,7 @@ static void ResolveRecoveryConflictWithVirtualXIDs(VirtualTransactionId *waitlis
|
||||
ProcSignalReason reason);
|
||||
static void ResolveRecoveryConflictWithLock(Oid dbOid, Oid relOid);
|
||||
static void SendRecoveryConflictWithBufferPin(ProcSignalReason reason);
|
||||
static void LogCurrentRunningXacts(RunningTransactions CurrRunningXacts);
|
||||
static XLogRecPtr LogCurrentRunningXacts(RunningTransactions CurrRunningXacts);
|
||||
static void LogAccessExclusiveLocks(int nlocks, xl_standby_lock *locks);
|
||||
|
||||
|
||||
@@ -853,10 +853,13 @@ standby_redo(XLogRecPtr lsn, XLogRecord *record)
|
||||
* currently running xids, performed by StandbyReleaseOldLocks().
|
||||
* Zero xids should no longer be possible, but we may be replaying WAL
|
||||
* from a time when they were possible.
|
||||
*
|
||||
* Returns the RecPtr of the last inserted record.
|
||||
*/
|
||||
void
|
||||
XLogRecPtr
|
||||
LogStandbySnapshot(void)
|
||||
{
|
||||
XLogRecPtr recptr;
|
||||
RunningTransactions running;
|
||||
xl_standby_lock *locks;
|
||||
int nlocks;
|
||||
@@ -876,9 +879,12 @@ LogStandbySnapshot(void)
|
||||
* record we write, because standby will open up when it sees this.
|
||||
*/
|
||||
running = GetRunningTransactionData();
|
||||
LogCurrentRunningXacts(running);
|
||||
recptr = LogCurrentRunningXacts(running);
|
||||
|
||||
/* GetRunningTransactionData() acquired XidGenLock, we must release it */
|
||||
LWLockRelease(XidGenLock);
|
||||
|
||||
return recptr;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -889,7 +895,7 @@ LogStandbySnapshot(void)
|
||||
* is a contiguous chunk of memory and never exists fully until it is
|
||||
* assembled in WAL.
|
||||
*/
|
||||
static void
|
||||
static XLogRecPtr
|
||||
LogCurrentRunningXacts(RunningTransactions CurrRunningXacts)
|
||||
{
|
||||
xl_running_xacts xlrec;
|
||||
@@ -939,6 +945,19 @@ LogCurrentRunningXacts(RunningTransactions CurrRunningXacts)
|
||||
CurrRunningXacts->oldestRunningXid,
|
||||
CurrRunningXacts->latestCompletedXid,
|
||||
CurrRunningXacts->nextXid);
|
||||
|
||||
/*
|
||||
* Ensure running_xacts information is synced to disk not too far in the
|
||||
* future. We don't want to stall anything though (i.e. use XLogFlush()),
|
||||
* so we let the wal writer do it during normal
|
||||
* operation. XLogSetAsyncXactLSN() conveniently will mark the LSN as
|
||||
* to-be-synced and nudge the WALWriter into action if sleeping. Check
|
||||
* XLogBackgroundFlush() for details why a record might not be flushed
|
||||
* without it.
|
||||
*/
|
||||
XLogSetAsyncXactLSN(recptr);
|
||||
|
||||
return recptr;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user