Re: 001_rep_changes.pl fails due to publisher stuck on shutdown - Mailing list pgsql-hackers

From Kyotaro Horiguchi
Subject Re: 001_rep_changes.pl fails due to publisher stuck on shutdown
Date
Msg-id 20240625.100339.1071702840459338337.horikyota.ntt@gmail.com
Whole thread Raw
In response to Re: 001_rep_changes.pl fails due to publisher stuck on shutdown  (Amit Kapila <amit.kapila16@gmail.com>)
List pgsql-hackers
At Fri, 21 Jun 2024 11:48:22 +0530, Amit Kapila <amit.kapila16@gmail.com> wrote in 
> On Wed, Jun 19, 2024 at 10:44 AM Hayato Kuroda (Fujitsu)
> <kuroda.hayato@fujitsu.com> wrote:
> >
> > Dear Horiguchi-san,
> >
> > Thanks for sharing the patch! I agree this approach (ensure WAL records are flushed)
> > Is more proper than others.
> >
> > I have an unclear point. According to the comment atop GetInsertRecPtr(), it just
> > returns the approximated value - the position of the last full WAL page [1].
> > If there is a continuation WAL record which across a page, will it return the
> > halfway point of the WAL record (end of the first WAL page)? If so, the proposed
> > fix seems not sufficient. We have to point out the exact the end of the record.
> >
> 
> You have a point but if this theory is correct why we are not able to
> reproduce the issue after this patch? Also, how to get the WAL
> location up to which we need to flush? Is XLogCtlData->logInsertResult
> the one we are looking for?

It is not exposed, but of course logInsertResult is more
straightforward source for the LSN.

The reason why the patch is working well is due to the following bit
of the code.

xlog.c:958, in XLInsertRecord()
>    /*
>     * Update shared LogwrtRqst.Write, if we crossed page boundary.
>     */
>    if (StartPos / XLOG_BLCKSZ != EndPos / XLOG_BLCKSZ)
>    {
>        SpinLockAcquire(&XLogCtl->info_lck);
>        /* advance global request to include new block(s) */
>        if (XLogCtl->LogwrtRqst.Write < EndPos)
>            XLogCtl->LogwrtRqst.Write = EndPos;
>        SpinLockRelease(&XLogCtl->info_lck);
>        RefreshXLogWriteResult(LogwrtResult);
>    }

The code, which exists has existed for a long time, ensures that
GetInsertRecPtr() returns the accurate end of a record when it spanns
over page boundaries. This would need to be written in the new comment
if we use GetInsertRecPtr().

regards.

-- 
Kyotaro Horiguchi
NTT Open Source Software Center

pgsql-hackers by date:

Previous
From: Japin Li
Date:
Subject: Re: Support "Right Semi Join" plan shapes
Next
From: "Imseih (AWS), Sami"
Date:
Subject: Re: Track the amount of time waiting due to cost_delay