From b16a0ccada3c2acc80bf733e71935677b9ab6382 Mon Sep 17 00:00:00 2001 From: Bertrand Drouvot Date: Tue, 25 Feb 2025 10:18:05 +0000 Subject: [PATCH v1] Flush the IO statistics of active walsenders The walsender does not flush its IO statistics until it exits. The issue is there since pg_stat_io has been introduced in a9c70b46dbe. This commits: 1. ensures it does not wait to exit to flush its IO statistics 2. adds a test --- src/backend/replication/walsender.c | 7 +++++++ .../recovery/t/035_standby_logical_decoding.pl | 15 +++++++++++++++ 2 files changed, 22 insertions(+) 26.2% src/backend/replication/ 73.7% src/test/recovery/t/ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 446d10c1a7d..3664d7d0c75 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -90,6 +90,7 @@ #include "utils/guc.h" #include "utils/memutils.h" #include "utils/pg_lsn.h" +#include "utils/pgstat_internal.h" #include "utils/ps_status.h" #include "utils/timeout.h" #include "utils/timestamp.h" @@ -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()) { diff --git a/src/test/recovery/t/035_standby_logical_decoding.pl b/src/test/recovery/t/035_standby_logical_decoding.pl index 8903177d883..ab34d290165 100644 --- a/src/test/recovery/t/035_standby_logical_decoding.pl +++ b/src/test/recovery/t/035_standby_logical_decoding.pl @@ -543,6 +543,9 @@ $node_subscriber->stop; reactive_slots_change_hfs_and_wait_for_xmins('behaves_ok_', 'vacuum_full_', 0, 1); +# To check that an active walsender updates its IO statistics below. +$node_standby->safe_psql('testdb', "SELECT pg_stat_reset_shared('io')"); + # Ensure that replication slot stats are not empty before triggering the # conflict. $node_primary->safe_psql('testdb', @@ -552,6 +555,18 @@ $node_standby->poll_query_until('testdb', qq[SELECT total_txns > 0 FROM pg_stat_replication_slots WHERE slot_name = 'vacuum_full_activeslot'] ) or die "replication slot stats of vacuum_full_activeslot not updated"; +# Ensure an active walsender updates its IO statistics. +is( $node_standby->safe_psql( + 'testdb', + qq(SELECT reads > 0 + FROM pg_catalog.pg_stat_io + WHERE backend_type = 'walsender' + AND object = 'relation' + AND context = 'normal') + ), + qq(t), + "Check that an active walsender updates its IO statistics"); + # This should trigger the conflict wait_until_vacuum_can_remove( 'full', 'CREATE TABLE conflict_test(x integer, y text); -- 2.34.1