]> granicus.if.org Git - postgresql/commitdiff
Wake WALSender to reduce data loss at failover for async commit.
authorSimon Riggs <simon@2ndQuadrant.com>
Thu, 7 Jun 2012 18:24:47 +0000 (19:24 +0100)
committerSimon Riggs <simon@2ndQuadrant.com>
Thu, 7 Jun 2012 18:24:47 +0000 (19:24 +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 f0db58fb6e8534f3c4fdf8f2264ba3593e911a26..898899374658a39bc3f9a0db849950bb1dcfe99b 100644 (file)
@@ -2168,6 +2168,7 @@ XLogBackgroundFlush(void)
 {
        XLogRecPtr      WriteRqstPtr;
        bool            flexible = true;
+       bool            wrote_something = false;
 
        /* XLOG doesn't need flushing during recovery */
        if (RecoveryInProgress())
@@ -2236,10 +2237,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();
 }
 
 /*