diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 19540206f9..03f440aa25 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -1177,8 +1177,8 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser WalSenderWriteData - Waiting for any activity when processing replies from WAL - receiver in WAL sender process. + Waiting to write WAL data to WAL receiver in + WAL sender process. diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 23baa4498a..acaec753c1 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -3115,15 +3115,22 @@ WalSndWakeup(void) } /* - * Wait for readiness on the FeBe socket, or a timeout. The mask should be - * composed of optional WL_SOCKET_WRITEABLE and WL_SOCKET_READABLE flags. Exit - * on postmaster death. + * Wait for readiness on the FeBe socket, a timeout, or the latch to be set. + * The mask should be composed of optional WL_SOCKET_WRITEABLE and + * WL_SOCKET_READABLE flags. Exit on postmaster death. + * + * Overwrite wait_event with WAIT_EVENT_WAL_SENDER_WRITE_DATA + * if we have pending data in the output buffer and are waiting to write + * data to a client. */ static void WalSndWait(uint32 socket_events, long timeout, uint32 wait_event) { WaitEvent event; + if (socket_events & WL_SOCKET_WRITEABLE) + wait_event = WAIT_EVENT_WAL_SENDER_WRITE_DATA; + ModifyWaitEvent(FeBeWaitSet, FeBeWaitSetSocketPos, socket_events, NULL); if (WaitEventSetWait(FeBeWaitSet, timeout, &event, 1, wait_event) == 1 && (event.events & WL_POSTMASTER_DEATH))