From c57cfd8dd27eaf9e0c17c47769cb24b8ab961116 Mon Sep 17 00:00:00 2001 From: Bharath Rupireddy Date: Mon, 25 Jul 2022 12:51:26 +0000 Subject: [PATCH v6] Add LOG messages when replication slots become active and inactive These logs will be extremely useful on production servers to debug and analyze inactive replication slot issues. --- doc/src/sgml/config.sgml | 7 +++--- src/backend/replication/slot.c | 21 ++++++++++++++++ src/backend/replication/walsender.c | 39 +++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index e2d728e0c4..8bf3c2ab53 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -7461,9 +7461,10 @@ log_line_prefix = '%m [%p] %q%u@%d/%a ' - Causes each replication command to be logged in the server log. - See for more information about - replication command. The default value is off. + Causes each replication command and related activity to be logged in + the server log. See for more + information about replication command. The default value is + off. Only superusers and users with the appropriate SET privilege can change this setting. diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index 850b74936f..43563bec7e 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -179,8 +179,29 @@ ReplicationSlotShmemExit(int code, Datum arg) { /* Make sure active replication slots are released */ if (MyReplicationSlot != NULL) + { + bool is_physical; + char slotname[NAMEDATALEN] = {0}; + + is_physical = SlotIsPhysical(MyReplicationSlot); + strcpy(slotname, NameStr(MyReplicationSlot->data.name)); + ReplicationSlotRelease(); + if (is_physical) + { + ereport(log_replication_commands ? LOG : DEBUG3, + (errmsg("released physical replication slot \"%s\"", + slotname))); + } + else + { + ereport(log_replication_commands ? LOG : DEBUG3, + (errmsg("released logical replication slot \"%s\"", + slotname))); + } + } + /* Also cleanup all the temporary slots. */ ReplicationSlotCleanup(); } diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 3a86786cc3..ebd34316e2 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -322,8 +322,29 @@ WalSndErrorCleanup(void) wal_segment_close(xlogreader); if (MyReplicationSlot != NULL) + { + bool is_physical; + char slotname[NAMEDATALEN] = {0}; + + is_physical = SlotIsPhysical(MyReplicationSlot); + strcpy(slotname, NameStr(MyReplicationSlot->data.name)); + ReplicationSlotRelease(); + if (is_physical) + { + ereport(log_replication_commands ? LOG : DEBUG3, + (errmsg("released physical replication slot \"%s\"", + slotname))); + } + else + { + ereport(log_replication_commands ? LOG : DEBUG3, + (errmsg("released logical replication slot \"%s\"", + slotname))); + } + } + ReplicationSlotCleanup(); replication_active = false; @@ -704,6 +725,10 @@ StartReplication(StartReplicationCmd *cmd) (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("cannot use a logical replication slot for physical replication"))); + ereport(log_replication_commands ? LOG : DEBUG3, + (errmsg("acquired physical replication slot \"%s\"", + cmd->slotname))); + /* * We don't need to verify the slot's restart_lsn here; instead we * rely on the caller requesting the starting point to use. If the @@ -844,8 +869,14 @@ StartReplication(StartReplicationCmd *cmd) } if (cmd->slotname) + { ReplicationSlotRelease(); + ereport(log_replication_commands ? LOG : DEBUG3, + (errmsg("released physical replication slot \"%s\"", + cmd->slotname))); + } + /* * Copy is finished now. Send a single-row result set indicating the next * timeline. @@ -1256,6 +1287,10 @@ StartLogicalReplication(StartReplicationCmd *cmd) cmd->slotname), errdetail("This slot has been invalidated because it exceeded the maximum reserved size."))); + ereport(log_replication_commands ? LOG : DEBUG3, + (errmsg("acquired logical replication slot \"%s\"", + cmd->slotname))); + /* * Force a disconnect, so that the decoding code doesn't need to care * about an eventual switch from running in recovery, to running in a @@ -1318,6 +1353,10 @@ StartLogicalReplication(StartReplicationCmd *cmd) FreeDecodingContext(logical_decoding_ctx); ReplicationSlotRelease(); + ereport(log_replication_commands ? LOG : DEBUG3, + (errmsg("released logical replication slot \"%s\"", + cmd->slotname))); + replication_active = false; if (got_STOPPING) proc_exit(0); -- 2.34.1