Log messages for replication slot acquisition and release.
authorAmit Kapila <[email protected]>
Tue, 21 Nov 2023 02:29:53 +0000 (07:59 +0530)
committerAmit Kapila <[email protected]>
Tue, 21 Nov 2023 02:29:53 +0000 (07:59 +0530)
This commit log messages (at LOG level when log_replication_commands is
set, otherwise at DEBUG1 level) when walsenders acquire and release
replication slots. These messages help to know the lifetime of a
replication slot - one can know how long a streaming standby, logical
subscriber, or replication slot consumer is down. These messages will be
useful on production servers to debug and analyze inactive replication
slots.

Note that these messages are emitted only for walsenders but not for
backends. This is because walsenders are the ones that typically hold
replication slots for longer durations, unlike backends which hold them
for executing replication related functions.

Author: Bharath Rupireddy
Reviewed-by: Peter Smith, Amit Kapila, Alvaro Herrera
Discussion: http://postgr.es/m/CALj2ACX17G7F-jeLt+7KhJ6YxVeRwR8Zk0rDh4VnT546o0UpTQ@mail.gmail.com

doc/src/sgml/config.sgml
src/backend/replication/slot.c

index fc35a46e5eab430f91554c420a5644a7a59a900f..9398afbcbd362dd74a96cf3ee315143a92d1247d 100644 (file)
@@ -7510,11 +7510,12 @@ log_line_prefix = '%m [%p] %q%u@%d/%a '
       </term>
       <listitem>
        <para>
-        Causes each replication command to be logged in the server log.
-        See <xref linkend="protocol-replication"/> for more information about
-        replication command. The default value is <literal>off</literal>.
-        Only superusers and users with the appropriate <literal>SET</literal>
-        privilege can change this setting.
+        Causes each replication command and <literal>walsender</literal>
+        process's replication slot acquisition/release to be logged in the
+        server log. See <xref linkend="protocol-replication"/> for more
+        information about replication command. The default value is
+        <literal>off</literal>. Only superusers and users with the appropriate
+        <literal>SET</literal> privilege can change this setting.
        </para>
       </listitem>
      </varlistentry>
index 781aa43cc4fcaa2f6c5072f3a3019c9176132fae..18bc28195b0181085d027d22727e2a13e212851b 100644 (file)
@@ -537,6 +537,16 @@ retry:
     */
    if (SlotIsLogical(s))
        pgstat_acquire_replslot(s);
+
+   if (am_walsender)
+   {
+       ereport(log_replication_commands ? LOG : DEBUG1,
+               SlotIsLogical(s)
+               ? errmsg("acquired logical replication slot \"%s\"",
+                        NameStr(s->data.name))
+               : errmsg("acquired physical replication slot \"%s\"",
+                        NameStr(s->data.name)));
+   }
 }
 
 /*
@@ -549,9 +559,17 @@ void
 ReplicationSlotRelease(void)
 {
    ReplicationSlot *slot = MyReplicationSlot;
+   char       *slotname = NULL;    /* keep compiler quiet */
+   bool        is_logical = false; /* keep compiler quiet */
 
    Assert(slot != NULL && slot->active_pid != 0);
 
+   if (am_walsender)
+   {
+       slotname = pstrdup(NameStr(slot->data.name));
+       is_logical = SlotIsLogical(slot);
+   }
+
    if (slot->data.persistency == RS_EPHEMERAL)
    {
        /*
@@ -596,6 +614,18 @@ ReplicationSlotRelease(void)
    MyProc->statusFlags &= ~PROC_IN_LOGICAL_DECODING;
    ProcGlobal->statusFlags[MyProc->pgxactoff] = MyProc->statusFlags;
    LWLockRelease(ProcArrayLock);
+
+   if (am_walsender)
+   {
+       ereport(log_replication_commands ? LOG : DEBUG1,
+               is_logical
+               ? errmsg("released logical replication slot \"%s\"",
+                        slotname)
+               : errmsg("released physical replication slot \"%s\"",
+                        slotname));
+
+       pfree(slotname);
+   }
 }
 
 /*