From dcd84981e456512dcd9c995fb4fe0df86bbe0d72 Mon Sep 17 00:00:00 2001 From: root 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