summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/postmaster/bgwriter.c5
-rw-r--r--src/backend/storage/ipc/standby.c21
2 files changed, 25 insertions, 1 deletions
diff --git a/src/backend/postmaster/bgwriter.c b/src/backend/postmaster/bgwriter.c
index 00f03d8acbe..654e4f8bd57 100644
--- a/src/backend/postmaster/bgwriter.c
+++ b/src/backend/postmaster/bgwriter.c
@@ -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;
}
}
diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c
index 6a9bf842d39..8b9b438ca92 100644
--- a/src/backend/storage/ipc/standby.c
+++ b/src/backend/storage/ipc/standby.c
@@ -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 ... */