Hi, In WalSndLoop() we do:
wakeEvents = WL_LATCH_SET | WL_POSTMASTER_DEATH | WL_TIMEOUT | WL_SOCKET_READABLE; if (pq_is_send_pending()) wakeEvents |= WL_SOCKET_WRITEABLE; else if (wal_sender_timeout > 0 && !ping_sent) { ... if (GetCurrentTimestamp() >= timeout) WalSndKeepalive(true); ... I think those two if's should simply be separate. There's no reason not to ask for a ping when we're writing. On a busy server that might be the case most of the time. The if (pq_is_send_pending()) should also be *after* sending the keepalive, after all, it might not immediately have been flushed as unlikely as that is. The attached patch is unsurprisingly simple. Greetings, Andres Freund -- Andres Freund http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 06b22e2..41db03d 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -1270,9 +1270,7 @@ WalSndLoop(void) wakeEvents = WL_LATCH_SET | WL_POSTMASTER_DEATH | WL_TIMEOUT | WL_SOCKET_READABLE; - if (pq_is_send_pending()) - wakeEvents |= WL_SOCKET_WRITEABLE; - else if (wal_sender_timeout > 0 && !ping_sent) + if (wal_sender_timeout > 0 && !ping_sent) { /* * If half of wal_sender_timeout has lapsed without receiving @@ -1291,6 +1289,9 @@ WalSndLoop(void) } } + if (pq_is_send_pending()) + wakeEvents |= WL_SOCKET_WRITEABLE; + /* Determine time until replication timeout */ if (wal_sender_timeout > 0) {
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers