public inbox for [email protected]
help / color / mirror / Atom feedFrom: Xuneng Zhou <[email protected]>
To: Alexander Korotkov <[email protected]>
To: Noah Misch <[email protected]>
Cc: Heikki Linnakangas <[email protected]>
Cc: Andres Freund <[email protected]>
Cc: Tom Lane <[email protected]>
Cc: Peter Eisentraut <[email protected]>
Cc: Thomas Munro <[email protected]>
Cc: Álvaro Herrera <[email protected]>
Cc: Chao Li <[email protected]>
Cc: pgsql-hackers <[email protected]>
Cc: Michael Paquier <[email protected]>
Cc: jian he <[email protected]>
Cc: Tomas Vondra <[email protected]>
Cc: Yura Sokolov <[email protected]>
Subject: Re: Implement waiting for wal lsn replay: reloaded
Date: Thu, 9 Jul 2026 20:24:57 +0800
Message-ID: <CABPTF7W-opV+1cfF-y0_jmSOtCvo=hzzUM7FCJE8-oGTQyofyQ@mail.gmail.com> (raw)
In-Reply-To: <CABPTF7UkddAnG=6X0JLHEOVWO-xoG3XYXgc1uWhbjj5eHRjipw@mail.gmail.com>
References: <[email protected]>
<CABPTF7WPRVJGdDeuWo-=3csnDs5FGfUsg97xppPyzoj9fRAMeQ@mail.gmail.com>
<CABPTF7WAcV_uEaJa3jmYPc26rApa64hV5HmjRBN=OS17MAybUg@mail.gmail.com>
<CAPpHfdvM9Tp1_g1JY9H+cx1H0Q4jH-BZFZGQwgviLNs1HSg+CA@mail.gmail.com>
<CABPTF7X0iV=kGC4gjsTj4NvK_NNEJGM3YTc7Obxs5GOiYoMhEw@mail.gmail.com>
<CABPTF7UBdEfyxATWntmCfoJrwB6iPrnhkXO7y_Avmqc2bOn27A@mail.gmail.com>
<CAPpHfduhQsm44j_ziZ6ykFTDZ2SFvZp04iCrc5_dD9PGZUrhrw@mail.gmail.com>
<d2ogsp54if47w35kx4vu7o3nkfghpuzctwbaudzey5brxavomw@bgfs3p7twoib>
<CABPTF7W7=uK0ypteDLRTiR4PnRP-BEUEJJtit+Q17aiPPhpLrw@mail.gmail.com>
<CABPTF7Ukk8iJF7TpnK2mFOaboNJgWL1csfXu4e3J4GT0o7x0GQ@mail.gmail.com>
<CAPpHfdupZ3ooxmnJvhjx7rnZ7VMcz_uyxGC4drMSEM_P3PtGzw@mail.gmail.com>
<CABPTF7WJ35p7uidJJZs7fzxBtbVL_0xSFUdZ2Fe8pXh00e=Mxw@mail.gmail.com>
<CAPpHfdufWG032J=fyv1eWoveeyPwqJ57PGU2edA5OsOmexGDTw@mail.gmail.com>
<CABPTF7W-gaO=FAkhda=_pDQJjLne68ioNHHU8vuB4iEnswR1=w@mail.gmail.com>
<[email protected]>
<CABPTF7XV=rPe9iVTyR5O=CT0oMUYTPJpr+4+T35n0oKeaaNZHQ@mail.gmail.com>
<CABPTF7V1GqXRe9Kyiw=oyDoUU4Oss49nMBhco12V7xb72P6WvQ@mail.gmail.com>
<CABPTF7XdpM8LCvrkQdXrj3qt88auofiVw_STbUnXg0GEuzbDNw@mail.gmail.com>
<CAPpHfdvu7bPzP1p3eZW3t6QgF39stTce=OyObyn6N2J+ZC5Khw@mail.gmail.com>
<CABPTF7UkddAnG=6X0JLHEOVWO-xoG3XYXgc1uWhbjj5eHRjipw@mail.gmail.com>
Hi!
As Noah pointed out in [1], auxiliary processes are supported in the
facility, but proper cleanup is absent when they exit. I have attached
a patch trying to address that as suggested before getting sidetracked
for too long with the issue raised in [2].
[1] https://www.postgresql.org/message-id/[email protected]
[2] https://www.postgresql.org/message-id/flat/20210803023612.iziacxk5syn2r4ut%40alap3.anarazel.de
--
Regards,
Xuneng Zhou
HighGo Software Co., Ltd.
Attachments:
[application/octet-stream] v1-0001-Add-wait-for-lsn-process-exit-cleanup-callback.patch (3.3K, ../CABPTF7W-opV+1cfF-y0_jmSOtCvo=hzzUM7FCJE8-oGTQyofyQ@mail.gmail.com/2-v1-0001-Add-wait-for-lsn-process-exit-cleanup-callback.patch)
download | inline diff:
From 638359aa9d6868dc0c7f5919e0596490311e8ee8 Mon Sep 17 00:00:00 2001
From: alterego655 <[email protected]>
Date: Thu, 9 Jul 2026 20:13:24 +0800
Subject: [PATCH v1] Add wait-for-lsn process-exit cleanup callback
Register an on_shmem_exit callback lazily before a process enters a
wait-for-lsn heap, so stale wait state is removed if the process exits while
waiting. This keeps cleanup local to xlogwait.c and covers non-backend
callers as well.
---
src/backend/access/transam/xlogwait.c | 33 +++++++++++++++++++++++++++
src/backend/storage/lmgr/proc.c | 6 -----
2 files changed, 33 insertions(+), 6 deletions(-)
diff --git a/src/backend/access/transam/xlogwait.c b/src/backend/access/transam/xlogwait.c
index 582dde3b061..aa6e549ea63 100644
--- a/src/backend/access/transam/xlogwait.c
+++ b/src/backend/access/transam/xlogwait.c
@@ -54,6 +54,7 @@
#include "miscadmin.h"
#include "pgstat.h"
#include "replication/walreceiver.h"
+#include "storage/ipc.h"
#include "storage/latch.h"
#include "storage/proc.h"
#include "storage/shmem.h"
@@ -69,8 +70,12 @@ static int waitlsn_cmp(const pairingheap_node *a, const pairingheap_node *b,
struct WaitLSNState *waitLSNState = NULL;
+static bool waitLSNShmemExitRegistered = false;
+
static void WaitLSNShmemRequest(void *arg);
static void WaitLSNShmemInit(void *arg);
+static void WaitLSNShmemExit(int code, Datum arg);
+static void RegisterWaitLSNShmemExit(void);
const ShmemCallbacks WaitLSNShmemCallbacks = {
.request_fn = WaitLSNShmemRequest,
@@ -378,6 +383,32 @@ WaitLSNCleanup(void)
}
}
+/*
+ * Exit callback to clean up any LSN wait state left behind if this process
+ * exits while waiting. Transaction abort paths call WaitLSNCleanup()
+ * directly.
+ */
+static void
+WaitLSNShmemExit(int code, Datum arg)
+{
+ WaitLSNCleanup();
+}
+
+/*
+ * Register the process-exit cleanup callback before this process can enter a
+ * wait-LSN heap. One backend can execute WAIT FOR LSN more than once, so
+ * remember whether the callback is already registered.
+ */
+static void
+RegisterWaitLSNShmemExit(void)
+{
+ if (!waitLSNShmemExitRegistered)
+ {
+ on_shmem_exit(WaitLSNShmemExit, 0);
+ waitLSNShmemExitRegistered = true;
+ }
+}
+
/*
* Check if the given LSN type requires recovery to be in progress.
* Standby wait types (replay, write, flush) require recovery;
@@ -412,6 +443,8 @@ WaitForLSN(WaitLSNType lsnType, XLogRecPtr targetLSN, int64 timeout)
/* Should have a valid proc number */
Assert(MyProcNumber >= 0 && MyProcNumber < MaxBackends + NUM_AUXILIARY_PROCS);
+ RegisterWaitLSNShmemExit();
+
if (timeout > 0)
{
endtime = TimestampTzPlusMilliseconds(GetCurrentTimestamp(), timeout);
diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c
index 59640bb4f97..2588b14826e 100644
--- a/src/backend/storage/lmgr/proc.c
+++ b/src/backend/storage/lmgr/proc.c
@@ -37,7 +37,6 @@
#include "access/transam.h"
#include "access/twophase.h"
#include "access/xlogutils.h"
-#include "access/xlogwait.h"
#include "miscadmin.h"
#include "pgstat.h"
#include "postmaster/autovacuum.h"
@@ -963,11 +962,6 @@ ProcKill(int code, Datum arg)
*/
LWLockReleaseAll();
- /*
- * Cleanup waiting for LSN if any.
- */
- WaitLSNCleanup();
-
/* Cancel any pending condition variable sleep, too */
ConditionVariableCancelSleep();
--
2.51.0
view thread (29+ messages)
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected]
Subject: Re: Implement waiting for wal lsn replay: reloaded
In-Reply-To: <CABPTF7W-opV+1cfF-y0_jmSOtCvo=hzzUM7FCJE8-oGTQyofyQ@mail.gmail.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox