From c2f6239a34908bd7fc7ef59e3d46aa0458d4fc7a Mon Sep 17 00:00:00 2001
From: Manu <manuelreyesbravo@gmail.com>
Date: Mon, 21 Sep 2026 20:53:25 -0300
Subject: [PATCH v1 3/5] Reset VACUUM's dead item progress counters after each
 index cycle

pg_stat_progress_vacuum documents num_dead_item_ids and dead_tuple_bytes
as what was collected since the last index vacuum cycle, but
dead_items_reset() emptied the dead item store without reporting it.
After each cycle the view kept showing the previous cycle's values until
the heap scan found the next page with dead items.

Before 667e65aac35 the same happened with num_dead_tuples, which was
documented the same way.

Found with the PROGRESS_DEBUG tracing proposed in the same thread.
---
 src/backend/access/heap/vacuumlazy.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 8e1f660bc2f..fb0a97b56bc 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -3525,10 +3525,22 @@ dead_items_add(LVRelState *vacrel, BlockNumber blkno, OffsetNumber *offsets,
 static void
 dead_items_reset(LVRelState *vacrel)
 {
+	const int	prog_index[2] = {
+		PROGRESS_VACUUM_NUM_DEAD_ITEM_IDS,
+		PROGRESS_VACUUM_DEAD_TUPLE_BYTES
+	};
+	const int64 prog_val[2] = {0, 0};
+
 	/* Update statistics for dead items */
 	vacrel->num_dead_items_resets++;
 	vacrel->total_dead_items_bytes += TidStoreMemoryUsage(vacrel->dead_items);
 
+	/*
+	 * Both progress counters are documented as what was collected since the
+	 * last index vacuum cycle, which is nothing yet.
+	 */
+	pgstat_progress_update_multi_param(2, prog_index, prog_val);
+
 	if (ParallelVacuumIsActive(vacrel))
 	{
 		parallel_vacuum_reset_dead_items(vacrel->pvs);
-- 
2.55.0

