From 643c0ff596153fe8c348ed892eb3db7017225a40 Mon Sep 17 00:00:00 2001 From: "Chao Li (Evan)" Date: Tue, 21 Apr 2026 09:53:59 +0800 Subject: [PATCH v1] logical: recompute required LSN when restart_lsn advances LogicalConfirmReceivedLocation() saves slot state when either catalog_xmin or restart_lsn is updated, but it only recomputes the global WAL retention requirement in the updated_xmin path. This misses the restart_lsn-only case, so excess WAL can be retained until a later recomputation. Call ReplicationSlotsComputeRequiredLSN() when updated_restart is true, and clarify the nearby comments. Author: Chao Li Reviewed-by: Discussion: https://postgr.es/m/ --- src/backend/replication/logical/logical.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c index a33a685dcc6..913a2a94136 100644 --- a/src/backend/replication/logical/logical.c +++ b/src/backend/replication/logical/logical.c @@ -1901,10 +1901,10 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn) } /* - * Now the new xmin is safely on disk, we can let the global value - * advance. We do not take ProcArrayLock or similar since we only - * advance xmin here and there's not much harm done by a concurrent - * computation missing that. + * Now the new xmin is safely on disk, we can let the global xmin + * horizon advance. We do not take ProcArrayLock or similar since we + * only advance xmin here and there's not much harm done by a + * concurrent computation missing that. */ if (updated_xmin) { @@ -1913,8 +1913,14 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn) SpinLockRelease(&MyReplicationSlot->mutex); ReplicationSlotsComputeRequiredXmin(false); - ReplicationSlotsComputeRequiredLSN(); } + + /* + * Now the new restart_lsn is safely on disk, recompute the global + * WAL retention requirement. + */ + if (updated_restart) + ReplicationSlotsComputeRequiredLSN(); } else { -- 2.50.1 (Apple Git-155)