WALSender now woken up after each background flush by WALwriter, avoiding
multi-second replication delay for an all-async commit workload.
Replication delay reduced from 7s with default settings to 200ms, allowing
significantly reduced data loss at failover.
Andres Freund and Simon Riggs
{
XLogRecPtr WriteRqstPtr;
bool flexible = true;
+ bool wrote_something = false;
/* XLOG doesn't need flushing during recovery */
if (RecoveryInProgress())
WriteRqst.Write = WriteRqstPtr;
WriteRqst.Flush = WriteRqstPtr;
XLogWrite(WriteRqst, flexible, false);
+ wrote_something = true;
}
LWLockRelease(WALWriteLock);
END_CRIT_SECTION();
+
+ /*
+ * If we wrote something then we have something to send to standbys also,
+ * otherwise the replication delay become around 7s with just async commit.
+ */
+ if (wrote_something)
+ WalSndWakeup();
}
/*