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:
Simon Riggs 2016-04-04 07:18:05 +01:00
parent a75a418d07
commit bf08f2292f
2 changed files with 25 additions and 1 deletions

View File

@ -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;
}
}

View File

@ -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 ... */