@@ -246,7 +246,7 @@ typedef struct LVSavedErrInfo
246246
247247
248248/* non-export function prototypes */
249- static void lazy_scan_heap (LVRelState * vacrel , int nworkers );
249+ static void lazy_scan_heap (LVRelState * vacrel );
250250static BlockNumber lazy_scan_skip (LVRelState * vacrel , Buffer * vmbuffer ,
251251 BlockNumber next_block ,
252252 bool * next_unskippable_allvis ,
@@ -514,11 +514,28 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
514514 vacrel -> NewRelminMxid = OldestMxact ;
515515 vacrel -> skippedallvis = false;
516516
517+ /*
518+ * Allocate dead_items array memory using dead_items_alloc. This handles
519+ * parallel VACUUM initialization as part of allocating shared memory
520+ * space used for dead_items. (But do a failsafe precheck first, to
521+ * ensure that parallel VACUUM won't be attempted at all when relfrozenxid
522+ * is already dangerously old.)
523+ */
524+ lazy_check_wraparound_failsafe (vacrel );
525+ dead_items_alloc (vacrel , params -> nworkers );
526+
517527 /*
518528 * Call lazy_scan_heap to perform all required heap pruning, index
519529 * vacuuming, and heap vacuuming (plus related processing)
520530 */
521- lazy_scan_heap (vacrel , params -> nworkers );
531+ lazy_scan_heap (vacrel );
532+
533+ /*
534+ * Free resources managed by dead_items_alloc. This ends parallel mode in
535+ * passing when necessary.
536+ */
537+ dead_items_cleanup (vacrel );
538+ Assert (!IsInParallelMode ());
522539
523540 /*
524541 * Update pg_class entries for each of rel's indexes where appropriate.
@@ -825,14 +842,14 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
825842 * supply.
826843 */
827844static void
828- lazy_scan_heap (LVRelState * vacrel , int nworkers )
845+ lazy_scan_heap (LVRelState * vacrel )
829846{
830- VacDeadItems * dead_items ;
831847 BlockNumber rel_pages = vacrel -> rel_pages ,
832848 blkno ,
833849 next_unskippable_block ,
834- next_failsafe_block ,
835- next_fsm_block_to_vacuum ;
850+ next_failsafe_block = 0 ,
851+ next_fsm_block_to_vacuum = 0 ;
852+ VacDeadItems * dead_items = vacrel -> dead_items ;
836853 Buffer vmbuffer = InvalidBuffer ;
837854 bool next_unskippable_allvis ,
838855 skipping_current_range ;
@@ -843,23 +860,6 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers)
843860 };
844861 int64 initprog_val [3 ];
845862
846- /*
847- * Do failsafe precheck before calling dead_items_alloc. This ensures
848- * that parallel VACUUM won't be attempted when relfrozenxid is already
849- * dangerously old.
850- */
851- lazy_check_wraparound_failsafe (vacrel );
852- next_failsafe_block = 0 ;
853-
854- /*
855- * Allocate the space for dead_items. Note that this handles parallel
856- * VACUUM initialization as part of allocating shared memory space used
857- * for dead_items.
858- */
859- dead_items_alloc (vacrel , nworkers );
860- dead_items = vacrel -> dead_items ;
861- next_fsm_block_to_vacuum = 0 ;
862-
863863 /* Report that we're scanning the heap, advertising total # of blocks */
864864 initprog_val [0 ] = PROGRESS_VACUUM_PHASE_SCAN_HEAP ;
865865 initprog_val [1 ] = rel_pages ;
@@ -1236,12 +1236,13 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers)
12361236 }
12371237 }
12381238
1239+ vacrel -> blkno = InvalidBlockNumber ;
1240+ if (BufferIsValid (vmbuffer ))
1241+ ReleaseBuffer (vmbuffer );
1242+
12391243 /* report that everything is now scanned */
12401244 pgstat_progress_update_param (PROGRESS_VACUUM_HEAP_BLKS_SCANNED , blkno );
12411245
1242- /* Clear the block number information */
1243- vacrel -> blkno = InvalidBlockNumber ;
1244-
12451246 /* now we can compute the new value for pg_class.reltuples */
12461247 vacrel -> new_live_tuples = vac_estimate_reltuples (vacrel -> rel , rel_pages ,
12471248 vacrel -> scanned_pages ,
@@ -1256,15 +1257,9 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers)
12561257 vacrel -> missed_dead_tuples ;
12571258
12581259 /*
1259- * Release any remaining pin on visibility map page.
1260+ * Do index vacuuming (call each index's ambulkdelete routine), then do
1261+ * related heap vacuuming
12601262 */
1261- if (BufferIsValid (vmbuffer ))
1262- {
1263- ReleaseBuffer (vmbuffer );
1264- vmbuffer = InvalidBuffer ;
1265- }
1266-
1267- /* Perform a final round of index and heap vacuuming */
12681263 if (dead_items -> num_items > 0 )
12691264 lazy_vacuum (vacrel );
12701265
@@ -1278,16 +1273,9 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers)
12781273 /* report all blocks vacuumed */
12791274 pgstat_progress_update_param (PROGRESS_VACUUM_HEAP_BLKS_VACUUMED , blkno );
12801275
1281- /* Do post-vacuum cleanup */
1276+ /* Do final index cleanup (call each index's amvacuumcleanup routine) */
12821277 if (vacrel -> nindexes > 0 && vacrel -> do_index_cleanup )
12831278 lazy_cleanup_all_indexes (vacrel );
1284-
1285- /*
1286- * Free resources managed by dead_items_alloc. This ends parallel mode in
1287- * passing when necessary.
1288- */
1289- dead_items_cleanup (vacrel );
1290- Assert (!IsInParallelMode ());
12911279}
12921280
12931281/*
0 commit comments