From 9902620947ae0ce100f58329929518b7e9ec9143 Mon Sep 17 00:00:00 2001 From: Justin Pryzby Date: Sun, 29 Dec 2019 16:02:50 -0600 Subject: [PATCH v1 6/6] Report number of hint bits written.. ..as requested by Jeff Janes --- src/backend/access/heap/vacuumlazy.c | 38 ++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index b739d49..d08cac3 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -128,6 +128,7 @@ typedef struct LVRelStats BlockNumber pages_removed; /* Due to truncation */ BlockNumber pages_frozen; BlockNumber pages_allvisible; + double hintbit_tuples; double tuples_deleted; BlockNumber nonempty_pages; /* actually, last nonempty page + 1 */ /* List of TIDs of tuples we intend to delete */ @@ -437,11 +438,12 @@ heap_vacuum_rel(Relation onerel, VacuumParams *params, vacrelstats->pages_allvisible, vacrelstats->pages_frozen); appendStringInfo(&buf, - _("tuples: %.0f removed, %.0f remain, %.0f are dead but not yet removable, oldest xmin: %u\n"), + _("tuples: %.0f removed, %.0f remain, %.0f are dead but not yet removable, oldest xmin: %u, wrote %.0f hint bits\n"), vacrelstats->tuples_deleted, vacrelstats->new_rel_tuples, vacrelstats->new_dead_tuples, - OldestXmin); + OldestXmin, + vacrelstats->hintbit_tuples); appendStringInfo(&buf, _("buffer usage: %d hits, %d misses, %d dirtied\n"), VacuumPageHit, @@ -962,14 +964,6 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats, } /* - * Prune all HOT-update chains in this page. - * - * We count tuples removed by the pruning step as removed by VACUUM. - */ - tups_vacuumed += heap_page_prune(onerel, buf, OldestXmin, false, - &vacrelstats->latestRemovedXid); - - /* * Now scan the page to collect vacuumable items and check for tuples * requiring freezing. */ @@ -989,6 +983,8 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats, offnum = OffsetNumberNext(offnum)) { ItemId itemid; + HTSV_Result satisfies; + int oldmask; itemid = PageGetItemId(page, offnum); @@ -1040,7 +1036,11 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats, * cases impossible (e.g. in-progress insert from the same * transaction). */ - switch (HeapTupleSatisfiesVacuum(&tuple, OldestXmin, buf)) + oldmask = tuple.t_data->t_infomask; + satisfies = HeapTupleSatisfiesVacuum(&tuple, OldestXmin, buf); + if (oldmask != tuple.t_data->t_infomask) + vacrelstats->hintbit_tuples++; + switch (satisfies) { case HEAPTUPLE_DEAD: @@ -1179,7 +1179,9 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats, * Each non-removable tuple must be checked to see if it needs * freezing. Note we already have exclusive buffer lock. */ - if (heap_prepare_freeze_tuple(tuple.t_data, + // Avoid freezing HEAPTUPLE_DEAD, as required + if (satisfies!=HEAPTUPLE_DEAD && + heap_prepare_freeze_tuple(tuple.t_data, relfrozenxid, relminmxid, FreezeLimit, MultiXactCutoff, &frozen[nfrozen], @@ -1192,6 +1194,14 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats, } /* scan along page */ /* + * Prune all HOT-update chains in this page. + * + * We count tuples removed by the pruning step as removed by VACUUM. + */ + tups_vacuumed += heap_page_prune(onerel, buf, OldestXmin, false, + &vacrelstats->latestRemovedXid); + + /* * If we froze any tuples, mark the buffer dirty, and write a WAL * record recording the changes. We must log the changes to be * crash-safe against future truncation of CLOG. @@ -1496,6 +1506,10 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats, "%u pages frozen.\n", vacrelstats->pages_frozen), vacrelstats->pages_frozen); + appendStringInfo(&sbuf, ngettext("%sWrote %.0f hint bit.\n", + "%sWrote %.0f hint bits.\n", + vacrelstats->hintbit_tuples), + msgprefix, vacrelstats->hintbit_tuples); appendStringInfo(&sbuf, _("%s%s."), msgprefix, pg_rusage_show(&ru0)); // why translate this ?? ereport(elevel, -- 2.7.4