At Fri, 21 Jun 2024 11:48:22 +0530, Amit Kapila <amit.kapil...@gmail.com> wrote in > On Wed, Jun 19, 2024 at 10:44 AM Hayato Kuroda (Fujitsu) > <kuroda.hay...@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