From f4f56dafc0c925b3d8909b985cc8245988f74b5d Mon Sep 17 00:00:00 2001 From: reVInotip Date: Sat, 18 Oct 2025 13:00:17 +0700 Subject: [PATCH 3/4] Pg stat replication Add new states to pg_stat_replication. They were added for the synchronous node that sends invalid values. These are indicated by a question mark and are needed to speed up problem localization. --- src/backend/replication/walsender.c | 18 +++++++++++++++--- src/include/access/xlogdefs.h | 1 + 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 90b12edf58a..2c92ef6d530 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -4099,14 +4099,26 @@ pg_stat_get_wal_senders(PG_FUNCTION_ARGS) * be switched to "potential" ones at the next moment. So, it's * basically useless to report "sync" or "potential" as their sync * states. We report just "quorum" for them. + * + * A question mark at the end of the role name indicates that the sending + * LSN cannot be calculated on this synchronous standby or on its standbys. */ if (priority == 0) values[10] = CStringGetTextDatum("async"); else if (is_sync_standby) - values[10] = SyncRepConfig->syncrep_method == SYNC_REP_PRIORITY ? - CStringGetTextDatum("sync") : CStringGetTextDatum("quorum"); + { + if (XLogRecPtrIsDefaultSending(flush)) + values[10] = SyncRepConfig->syncrep_method == SYNC_REP_PRIORITY ? + CStringGetTextDatum("sync?") : CStringGetTextDatum("quorum?"); + else + values[10] = SyncRepConfig->syncrep_method == SYNC_REP_PRIORITY ? + CStringGetTextDatum("sync") : CStringGetTextDatum("quorum"); + } else - values[10] = CStringGetTextDatum("potential"); + if (XLogRecPtrIsDefaultSending(flush)) + values[10] = CStringGetTextDatum("potential?"); + else + values[10] = CStringGetTextDatum("potential"); if (replyTime == 0) nulls[11] = true; diff --git a/src/include/access/xlogdefs.h b/src/include/access/xlogdefs.h index c870c51d13d..ae5bfc6881e 100644 --- a/src/include/access/xlogdefs.h +++ b/src/include/access/xlogdefs.h @@ -34,6 +34,7 @@ typedef uint64 XLogRecPtr; * (for example, when the number of synchronous standbys is less than required). */ #define DefaultSendingLSN ((XLogRecPtr) 2) +#define XLogRecPtrIsDefaultSending(r) ((r) == DefaultSendingLSN) /* * First LSN to use for "fake" LSNs.