On Tue, Feb 25, 2025 at 01:42:08PM +0000, Bertrand Drouvot wrote: > Now we can see that the numbers increased for the relation object and that we > get non zeros numbers for the wal object too (which makes fully sense). > > With the attached patch applied, we would get the same numbers already in > step 4. (means the stats are flushed without the need to wait for the > walsender > to exit).
@@ -2793,6 +2794,12 @@ WalSndLoop(WalSndSendDataCallback send_data) if (pq_flush_if_writable() != 0) WalSndShutdown(); + /* + * Report IO statistics + */ + pgstat_flush_io(false); + (void) pgstat_flush_backend(false, PGSTAT_BACKEND_FLUSH_IO); + /* If nothing remains to be sent right now ... */ if (WalSndCaughtUp && !pq_is_send_pending()) { That's bad, worse for a logical WAL sender, because it means that we have no idea what kind of I/O happens in this process until it exits, and logical WAL senders could loop forever, since v16 where we've begun tracking I/O. A non-forced periodic flush like you are proposing here sounds OK to me, but the position of the flush could be positioned better in the loop. If there is a SIGUSR2 (aka got_SIGUSR2 is true), WAL senders would shut down, so it seems rather pointless to do a flush just before exiting the process in WalSndDone(), no? I'd suggest to move the flush attempt closer to where we wait for some activity, just after WalSndKeepaliveIfNecessary(). -- Michael
signature.asc
Description: PGP signature