Avoid archiving XLOG_RUNNING_XACTS on idle server
If archive_timeout > 0 we should avoid logging XLOG_RUNNING_XACTS if idle. Bug 13685 reported by Laurence Rowe, investigated in detail by Michael Paquier, though this is not his proposed fix. 20151016203031.3019.72930@wrigleys.postgresql.org Simple non-invasive patch to allow later backpatch to 9.4 and 9.5
This commit is contained in:
parent
a75a418d07
commit
bf08f2292f
|
@ -330,8 +330,11 @@ BackgroundWriterMain(void)
|
|||
if (now >= timeout &&
|
||||
last_snapshot_lsn != GetXLogInsertRecPtr())
|
||||
{
|
||||
last_snapshot_lsn = LogStandbySnapshot();
|
||||
XLogRecPtr log_standby_lsn = LogStandbySnapshot();
|
||||
|
||||
last_snapshot_ts = now;
|
||||
if (!XLogRecPtrIsInvalid(log_standby_lsn))
|
||||
last_snapshot_lsn = log_standby_lsn;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -902,6 +902,7 @@ LogStandbySnapshot(void)
|
|||
RunningTransactions running;
|
||||
xl_standby_lock *locks;
|
||||
int nlocks;
|
||||
static bool last_snapshot_overflowed = false;
|
||||
|
||||
Assert(XLogStandbyInfoActive());
|
||||
|
||||
|
@ -932,8 +933,28 @@ LogStandbySnapshot(void)
|
|||
* only a shared lock.
|
||||
*/
|
||||
if (wal_level < WAL_LEVEL_LOGICAL)
|
||||
{
|
||||
LWLockRelease(ProcArrayLock);
|
||||
|
||||
/*
|
||||
* Don't bother to log anything if nothing is happening, if we are
|
||||
* using archive_timeout > 0 and we didn't overflow snapshot last time.
|
||||
*
|
||||
* This ensures that we don't issue an empty WAL record, which can
|
||||
* be annoying when used in conjunction with archive timeout.
|
||||
*/
|
||||
if (running->xcnt == 0 &&
|
||||
nlocks == 0 &&
|
||||
XLogArchiveTimeout > 0 &&
|
||||
!last_snapshot_overflowed)
|
||||
{
|
||||
LWLockRelease(XidGenLock);
|
||||
return InvalidXLogRecPtr;
|
||||
}
|
||||
|
||||
last_snapshot_overflowed = running->subxid_overflow;
|
||||
}
|
||||
|
||||
recptr = LogCurrentRunningXacts(running);
|
||||
|
||||
/* Release lock if we kept it longer ... */
|
||||
|
|
Loading…
Reference in New Issue