0001-Keep-WAL-segments-by-slot-s-flushed-restart-LSN.patch
text/x-patch
Filename: 0001-Keep-WAL-segments-by-slot-s-flushed-restart-LSN.patch
Type: text/x-patch
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch 0001
Subject: Keep WAL segments by slot's flushed restart LSN
| File | + | − |
|---|---|---|
| src/backend/replication/slot.c | 7 | 2 |
| src/include/replication/slot.h | 4 | 0 |
From acae6b55fc766d2fe1bfe85eb8af85110f55dcc8 Mon Sep 17 00:00:00 2001 From: Vitaly Davydov <v.davydov@postgrespro.ru> Date: Thu, 31 Oct 2024 12:29:12 +0300 Subject: [PATCH] Keep WAL segments by slot's flushed restart LSN --- src/backend/replication/slot.c | 9 +++++++-- src/include/replication/slot.h | 4 ++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index 6828100cf1..ee7ab3678e 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -1148,7 +1148,9 @@ ReplicationSlotsComputeRequiredLSN(void) continue; SpinLockAcquire(&s->mutex); - restart_lsn = s->data.restart_lsn; + restart_lsn = s->restart_lsn_flushed != InvalidXLogRecPtr ? + s->restart_lsn_flushed : + s->data.restart_lsn; invalidated = s->data.invalidated != RS_INVAL_NONE; SpinLockRelease(&s->mutex); @@ -1207,7 +1209,9 @@ ReplicationSlotsComputeLogicalRestartLSN(void) /* read once, it's ok if it increases while we're checking */ SpinLockAcquire(&s->mutex); - restart_lsn = s->data.restart_lsn; + restart_lsn = s->restart_lsn_flushed != InvalidXLogRecPtr ? + s->restart_lsn_flushed : + s->data.restart_lsn; invalidated = s->data.invalidated != RS_INVAL_NONE; SpinLockRelease(&s->mutex); @@ -2097,6 +2101,7 @@ SaveSlotToPath(ReplicationSlot *slot, const char *dir, int elevel) SpinLockAcquire(&slot->mutex); memcpy(&cp.slotdata, &slot->data, sizeof(ReplicationSlotPersistentData)); + slot->restart_lsn_flushed = slot->data.restart_lsn; SpinLockRelease(&slot->mutex); diff --git a/src/include/replication/slot.h b/src/include/replication/slot.h index 45582cf9d8..ca4c3aab3b 100644 --- a/src/include/replication/slot.h +++ b/src/include/replication/slot.h @@ -207,6 +207,10 @@ typedef struct ReplicationSlot /* The time since the slot has become inactive */ TimestampTz inactive_since; + + /* Latest restart LSN that was flushed to disk */ + XLogRecPtr restart_lsn_flushed; + } ReplicationSlot; #define SlotIsPhysical(slot) ((slot)->data.database == InvalidOid) -- 2.34.1