From f8795d2ec8632a7242896e0f8322d13bfe922512 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 12 Jun 2018 06:52:34 +0900 Subject: [PATCH] Fix oversight from 9e149c8 with spin-lock handling Calling an external function while a pin-lock is held is a bad idea as those are designed to be short-lived. The stress of a first commit into a large git history may contribute to that. Reported-by: Andres Freund Discussion: https://postgr.es/m/20180611164952.vmxdpdpirdtkdsz6@alap3.anarazel.de --- src/backend/replication/slot.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index 79d7a57d67..e8b76b2f20 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -999,6 +999,7 @@ ReplicationSlotReserveWal(void) while (true) { XLogSegNo segno; + XLogRecPtr restart_lsn; /* * For logical slots log a standby snapshot and start logical decoding @@ -1016,8 +1017,9 @@ ReplicationSlotReserveWal(void) XLogRecPtr flushptr; /* start at current insert position */ + restart_lsn = GetXLogInsertRecPtr(); SpinLockAcquire(&slot->mutex); - slot->data.restart_lsn = GetXLogInsertRecPtr(); + slot->data.restart_lsn = restart_lsn; SpinLockRelease(&slot->mutex); /* make sure we have enough information to start */ @@ -1028,8 +1030,9 @@ ReplicationSlotReserveWal(void) } else { + restart_lsn = GetRedoRecPtr(); SpinLockAcquire(&slot->mutex); - slot->data.restart_lsn = GetRedoRecPtr(); + slot->data.restart_lsn = restart_lsn; SpinLockRelease(&slot->mutex); }