Hello. At Tue, 6 Jul 2021 20:42:23 +0800, "zwj" <757634...@qq.com> wrote in > But I wonder whether it is necessary or not while my file system can protect > the blocks of database to be torn. And I read a comment in > function MarkBufferDirtyHint: > > /* > * If we need to protect hint bit updates from torn writes, WAL-log a > * full page image of the page. This full page image is only necessary > * if the hint bit update is the first change to the page since the > * last checkpoint. > * > * We don't check full_page_writes here because that logic is included > * when we call XLogInsert() since the value changes dynamically. > */ > > However, the code tell me it has nothing to do with full_page_writes. I can't > figure it out.
The doc of wal_log_hints says that "*even* for non-critical modifications of so-called hint bits", which seems to me implies it is following full_page_writes (and I think it is nonsense otherwise, as you suspect). XLogSaveBufferForHint sets REGBUF_FORCE_IMAGE since 2c03216d83116 when the symbol was introduced. As my understanding XLogInsert did not have an ability to enforce FPIs before the commit. The code comment above is older than that commit. So it seems to me a thinko that XLogSaveBufferForHint sets REGBUF_FORCE_IMAGE. I think the attached fixes that thinko. regards. -- Kyotaro Horiguchi NTT Open Source Software Center
>From d0d3d52953eda6451c212f4994fdc21a8284f6c1 Mon Sep 17 00:00:00 2001 From: Kyotaro Horiguchi <horikyota....@gmail.com> Date: Wed, 7 Jul 2021 15:34:41 +0900 Subject: [PATCH] Make FPI_FOR_HINT follow standard FPI emitting policy Commit 2c03216d831160bedd72d45f712601b6f7d03f1c changed XLogSaveBufferForHint to enforce FPI but the caller didn't intend to do so. Restore the intended behavior that FPI_FOR_HINT follows full_page_writes. --- src/backend/access/transam/xloginsert.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/backend/access/transam/xloginsert.c b/src/backend/access/transam/xloginsert.c index 3d2c9c3e8c..e596a0470a 100644 --- a/src/backend/access/transam/xloginsert.c +++ b/src/backend/access/transam/xloginsert.c @@ -287,8 +287,6 @@ XLogRegisterBlock(uint8 block_id, RelFileNode *rnode, ForkNumber forknum, { registered_buffer *regbuf; - /* This is currently only used to WAL-log a full-page image of a page */ - Assert(flags & REGBUF_FORCE_IMAGE); Assert(begininsert_called); if (block_id >= max_registered_block_id) @@ -995,7 +993,7 @@ XLogSaveBufferForHint(Buffer buffer, bool buffer_std) if (lsn <= RedoRecPtr) { - int flags; + int flags = 0; PGAlignedBlock copied_buffer; char *origdata = (char *) BufferGetBlock(buffer); RelFileNode rnode; @@ -1022,7 +1020,6 @@ XLogSaveBufferForHint(Buffer buffer, bool buffer_std) XLogBeginInsert(); - flags = REGBUF_FORCE_IMAGE; if (buffer_std) flags |= REGBUF_STANDARD; -- 2.27.0