At Thu, 13 Jun 2024 09:29:03 +0530, Amit Kapila <amit.kapil...@gmail.com> wrote in > Yeah, but the commit you quoted later reverted by commit 703f148e98 > and committed again as c6c3334364.
Yeah, right.. > > aiming to prevent walsenders from > > generating competing WAL (by, for example, CREATE_REPLICATION_SLOT) > > records with the shutdown checkpoint. Thus, it seems that the > > walsender cannot see the shutdown record, > > > > This is true of logical walsender. The physical walsender do send > shutdown checkpoint record before getting terminated. Yes, I know. They differ in their blocking mechanisms. > > and a certain amount of > > bytes before it, as the walsender appears to have relied on the > > checkpoint flushing its record, rather than on XLogBackgroundFlush(). > > > > If we approve of the walsender being terminated before the shutdown > > checkpoint, we need to "fix" the comment, then provide a function to > > ensure the synchronization of WAL records. > > > > Which comment do you want to fix? Yeah. The part you seem to think I was trying to fix is actually fine. Instead, I have revised the comment on the modified section to make its intention clearer. > > I'll consider this direction for a while. > > > > Okay, thanks. The attached patch is it. It's only for the master. I decided not to create a new function because the simple code has only one caller. I haven't seen the test script fail with this fix. regards. -- Kyotaro Horiguchi NTT Open Source Software Center
>From 663bdeaf8d4d2f5a192dd3ecb6d2817d9b1311f1 Mon Sep 17 00:00:00 2001 From: Kyotaro Horiguchi <horikyota....@gmail.com> Date: Tue, 18 Jun 2024 16:36:43 +0900 Subject: [PATCH] Ensure WAL is written out when terminating a logical walsender In commit c6c3334364, XLogBackgroundFlush() was assumed to flush all written WAL to the end, but this function may not flush the last incomplete page in a single call. In such cases, if the last written page ends with a continuation record, the latter part will not be flushed, causing shutdown to wait indefinitely for that part. This commit ensures that the written records are fully flushed to the end, guaranteeing expected behavior. --- src/backend/replication/walsender.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index c623b07cf0..5aa0f58238 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -1858,12 +1858,13 @@ WalSndWaitForWal(XLogRecPtr loc) ProcessRepliesIfAny(); /* - * If we're shutting down, trigger pending WAL to be written out, - * otherwise we'd possibly end up waiting for WAL that never gets - * written, because walwriter has shut down already. + * If we're shutting down, all WAL-writing processes are gone, leaving + * only checkpointer to perform the shutdown checkpoint. Ensure that + * any pending WAL is written out here; otherwise, we'd possibly end up + * waiting for WAL that never gets written. */ - if (got_STOPPING) - XLogBackgroundFlush(); + if (got_STOPPING && !RecoveryInProgress()) + XLogFlush(GetInsertRecPtr()); /* * To avoid the scenario where standbys need to catch up to a newer -- 2.43.0