Wake WALSender to reduce data loss at failover for async commit.
authorSimon Riggs <simon@2ndQuadrant.com>
Thu, 7 Jun 2012 18:26:03 +0000 (19:26 +0100)
committerSimon Riggs <simon@2ndQuadrant.com>
Thu, 7 Jun 2012 18:26:03 +0000 (19:26 +0100)
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

src/backend/access/transam/xlog.c

index 3902c583134449e6873fddc5da4845245e91f65a..64d7660b38ba425f050cb4c128815bd8f096cbc4 100644 (file)
@@ -2115,6 +2115,7 @@ XLogBackgroundFlush(void)
 {
        XLogRecPtr      WriteRqstPtr;
        bool            flexible = true;
+       bool            wrote_something = false;
 
        /* XLOG doesn't need flushing during recovery */
        if (RecoveryInProgress())
@@ -2183,10 +2184,18 @@ XLogBackgroundFlush(void)
                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();
 }
 
 /*