Set LSN for wbuf in _hash_freeovflpage() iff wbuf is modified.
authorAmit Kapila <akapila@postgresql.org>
Wed, 7 Feb 2024 05:40:12 +0000 (11:10 +0530)
committerAmit Kapila <akapila@postgresql.org>
Wed, 7 Feb 2024 05:40:12 +0000 (11:10 +0530)
Commit 861f86beea used REGBUF_NO_CHANGE at one of the places in the hash
index to register the clean buffers but forgot to avoid setting LSN in
that case.

Reported-by: Michael Paquier
Author: Kuroda Hayato
Reviewed-by: Amit Kapila, Michael Paquier
Discussion: https://postgr.es/m/ZbyVVG_7eW3YD5-A@paquier.xyz

src/backend/access/hash/hashovfl.c

index b512d0bcb66c1453b850c79d83c2d6690300f819..c280ae885e37a82c0365b5e8450ff7a7d0cb4224 100644 (file)
@@ -647,6 +647,7 @@ _hash_freeovflpage(Relation rel, Buffer bucketbuf, Buffer ovflbuf,
                xl_hash_squeeze_page xlrec;
                XLogRecPtr      recptr;
                int                     i;
+               bool            mod_wbuf = false;
 
                xlrec.prevblkno = prevblkno;
                xlrec.nextblkno = nextblkno;
@@ -671,6 +672,10 @@ _hash_freeovflpage(Relation rel, Buffer bucketbuf, Buffer ovflbuf,
                if (xlrec.ntups > 0)
                {
                        XLogRegisterBuffer(1, wbuf, REGBUF_STANDARD);
+
+                       /* Remember that wbuf is modified. */
+                       mod_wbuf = true;
+
                        XLogRegisterBufData(1, (char *) itup_offsets,
                                                                nitups * sizeof(OffsetNumber));
                        for (i = 0; i < nitups; i++)
@@ -690,7 +695,14 @@ _hash_freeovflpage(Relation rel, Buffer bucketbuf, Buffer ovflbuf,
 
                        wbuf_flags = REGBUF_STANDARD;
                        if (!xlrec.is_prev_bucket_same_wrt)
+                       {
                                wbuf_flags |= REGBUF_NO_CHANGE;
+                       }
+                       else
+                       {
+                               /* Remember that wbuf is modified. */
+                               mod_wbuf = true;
+                       }
                        XLogRegisterBuffer(1, wbuf, wbuf_flags);
                }
 
@@ -719,7 +731,10 @@ _hash_freeovflpage(Relation rel, Buffer bucketbuf, Buffer ovflbuf,
 
                recptr = XLogInsert(RM_HASH_ID, XLOG_HASH_SQUEEZE_PAGE);
 
-               PageSetLSN(BufferGetPage(wbuf), recptr);
+               /* Set LSN iff wbuf is modified. */
+               if (mod_wbuf)
+                       PageSetLSN(BufferGetPage(wbuf), recptr);
+
                PageSetLSN(BufferGetPage(ovflbuf), recptr);
 
                if (BufferIsValid(prevbuf) && !xlrec.is_prev_bucket_same_wrt)