0001-Ignore-invalidated-slots-while-computing-the-oldest-.patch

application/octet-stream

Filename: 0001-Ignore-invalidated-slots-while-computing-the-oldest-.patch
Type: application/octet-stream
Part: 0
Message: Catalog_xmin is not advanced when a logical slot is lost

Patch

Format: format-patch
Series: patch 0001
Subject: Ignore invalidated slots while computing the oldest xmin
File+
src/backend/replication/slot.c 6 0
From dcd84981e456512dcd9c995fb4fe0df86bbe0d72 Mon Sep 17 00:00:00 2001
From: root <root@pgvm.rlsumirojk0etd4qpjbaa2afce.tx.internal.cloudapp.net>
Date: Thu, 10 Nov 2022 10:18:24 +0000
Subject: [PATCH] Ignore invalidated slots while computing the oldest xmin

Catalog_xmin will not advance when a slot is invalidated until the invalidated slot is dropped.
This patch ignores invalidated slots while computing the oldest xmin.
---
 src/backend/replication/slot.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index c036a2c37b..2617563a09 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -847,6 +847,7 @@ ReplicationSlotsComputeRequiredXmin(bool already_locked)
 		ReplicationSlot *s = &ReplicationSlotCtl->replication_slots[i];
 		TransactionId effective_xmin;
 		TransactionId effective_catalog_xmin;
+		TransactionId invalidated_at_lsn;
 
 		if (!s->in_use)
 			continue;
@@ -854,8 +855,13 @@ ReplicationSlotsComputeRequiredXmin(bool already_locked)
 		SpinLockAcquire(&s->mutex);
 		effective_xmin = s->effective_xmin;
 		effective_catalog_xmin = s->effective_catalog_xmin;
+		invalidated_at_lsn = s->data.invalidated_at;
 		SpinLockRelease(&s->mutex);
 
+		/* ignore invalid slots while computing the oldest xmin */
+		if (TransactionIdIsValid(invalidated_at_lsn))
+			continue;
+
 		/* check the data xmin */
 		if (TransactionIdIsValid(effective_xmin) &&
 			(!TransactionIdIsValid(agg_xmin) ||
-- 
2.25.1