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