Reset btpo_cycleid in nbtree VACUUM's REDO routine.
authorPeter Geoghegan <pg@bowt.ie>
Mon, 23 Dec 2024 20:46:00 +0000 (15:46 -0500)
committerPeter Geoghegan <pg@bowt.ie>
Mon, 23 Dec 2024 20:46:00 +0000 (15:46 -0500)
Reset btpo_cycleid to 0 in btree_xlog_vacuum for consistency with
_bt_delitems_vacuum (the corresponding original execution code).  This
makes things neater.

There might be some performance benefit to being consistent like this.
When btvacuumpage doesn't call _bt_delitems_vacuum, it can still
proactively reset btpo_cycleid to 0 via a separate hint-like update
mechanism (it does so whenever it sees that it isn't already set to 0).
And so it's possible that being consistent about resetting btpo_cycleid
like this will save work later on, after standby promotion: subsequent
VACUUMs won't need to clear btpo_cycleid using the hint-like update
mechanism as often as they otherwise would.

Author: Peter Geoghegan <pg@bowt.ie>
Reviewed-By: Andrey Borodin <x4mmm@yandex-team.ru>
Discussion: https://postgr.es/m/CAH2-Wz=+LDFxn9NZyEsCo8ifcyKt6+n-VLyygySEHgMz+oynqw@mail.gmail.com

src/backend/access/nbtree/nbtxlog.c

index 7e91584f1ae46bc01384b0e8113d81015bbe5273..901b5f70be309cbe4068d09c5e1275ab54d1929b 100644 (file)
@@ -634,10 +634,11 @@ btree_xlog_vacuum(XLogReaderState *record)
                        PageIndexMultiDelete(page, (OffsetNumber *) ptr, xlrec->ndeleted);
 
                /*
-                * Mark the page as not containing any LP_DEAD items --- see comments
-                * in _bt_delitems_vacuum().
+                * Clear the vacuum cycle ID, and mark the page as not containing any
+                * LP_DEAD items
                 */
                opaque = BTPageGetOpaque(page);
+               opaque->btpo_cycleid = 0;
                opaque->btpo_flags &= ~BTP_HAS_GARBAGE;
 
                PageSetLSN(page, lsn);
@@ -698,7 +699,10 @@ btree_xlog_delete(XLogReaderState *record)
                if (xlrec->ndeleted > 0)
                        PageIndexMultiDelete(page, (OffsetNumber *) ptr, xlrec->ndeleted);
 
-               /* Mark the page as not containing any LP_DEAD items */
+               /*
+                * Do *not* clear the vacuum cycle ID, but do mark the page as not
+                * containing any LP_DEAD items
+                */
                opaque = BTPageGetOpaque(page);
                opaque->btpo_flags &= ~BTP_HAS_GARBAGE;