]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix CheckPointReplicationSlots() with max_replication_slots == 0
authorAlexander Korotkov <akorotkov@postgresql.org>
Fri, 27 Jun 2025 08:49:00 +0000 (11:49 +0300)
committerAlexander Korotkov <akorotkov@postgresql.org>
Fri, 27 Jun 2025 08:49:00 +0000 (11:49 +0300)
ca307d5cec90 made CheckPointReplicationSlots() unconditionally call
ReplicationSlotsComputeRequiredLSN().  It causes an assertion trap when
max_replication_slots equals 0.  This commit makes
CheckPointReplicationSlots() call ReplicationSlotsComputeRequiredLSN() only
when at least one slot gets its last_saved_restart_lsn updated.  That avoids
an assert trap and also saves some cycles when no one slot has
last_saved_restart_lsn updated.

Based on ideas from Dilip Kumar <dilipbalaut@gmail.com> and
Hayato Kuroda <kuroda.hayato@fujitsu.com>.

Reported-by: Zhijie Hou <houzj.fnst@fujitsu.com>
Discussion: https://postgr.es/m/OS0PR01MB5716BB506AF934376FF3A8BB947BA%40OS0PR01MB5716.jpnprd01.prod.outlook.com

src/backend/replication/slot.c

index c11e588d63221b828c40572d50719e80cd13cebd..f9fec50ae883ff4bf6792e5cc3831ca0c736ecad 100644 (file)
@@ -2079,6 +2079,7 @@ void
 CheckPointReplicationSlots(bool is_shutdown)
 {
        int                     i;
+       bool            last_saved_restart_lsn_updated = false;
 
        elog(DEBUG1, "performing replication slot checkpoint");
 
@@ -2123,15 +2124,23 @@ CheckPointReplicationSlots(bool is_shutdown)
                        SpinLockRelease(&s->mutex);
                }
 
+               /*
+                * Track if we're going to update slot's last_saved_restart_lsn. We
+                * need this to know if we need to recompute the required LSN.
+                */
+               if (s->last_saved_restart_lsn != s->data.restart_lsn)
+                       last_saved_restart_lsn_updated = true;
+
                SaveSlotToPath(s, path, LOG);
        }
        LWLockRelease(ReplicationSlotAllocationLock);
 
        /*
-        * Recompute the required LSN as SaveSlotToPath() updated
-        * last_saved_restart_lsn for slots.
+        * Recompute the required LSN if SaveSlotToPath() updated
+        * last_saved_restart_lsn for any slot.
         */
-       ReplicationSlotsComputeRequiredLSN();
+       if (last_saved_restart_lsn_updated)
+               ReplicationSlotsComputeRequiredLSN();
 }
 
 /*