@ -163,7 +163,8 @@ static void lazy_cleanup_index(Relation indrel,
LVRelStats * vacrelstats ) ;
LVRelStats * vacrelstats ) ;
static int lazy_vacuum_page ( Relation onerel , BlockNumber blkno , Buffer buffer ,
static int lazy_vacuum_page ( Relation onerel , BlockNumber blkno , Buffer buffer ,
int tupindex , LVRelStats * vacrelstats , Buffer * vmbuffer ) ;
int tupindex , LVRelStats * vacrelstats , Buffer * vmbuffer ) ;
static bool should_attempt_truncation ( Relation rel , LVRelStats * vacrelstats ) ;
static bool should_attempt_truncation ( VacuumParams * params ,
LVRelStats * vacrelstats ) ;
static void lazy_truncate_heap ( Relation onerel , LVRelStats * vacrelstats ) ;
static void lazy_truncate_heap ( Relation onerel , LVRelStats * vacrelstats ) ;
static BlockNumber count_nondeletable_pages ( Relation onerel ,
static BlockNumber count_nondeletable_pages ( Relation onerel ,
LVRelStats * vacrelstats ) ;
LVRelStats * vacrelstats ) ;
@ -210,6 +211,7 @@ heap_vacuum_rel(Relation onerel, VacuumParams *params,
Assert ( params ! = NULL ) ;
Assert ( params ! = NULL ) ;
Assert ( params - > index_cleanup ! = VACOPT_TERNARY_DEFAULT ) ;
Assert ( params - > index_cleanup ! = VACOPT_TERNARY_DEFAULT ) ;
Assert ( params - > truncate ! = VACOPT_TERNARY_DEFAULT ) ;
/* not every AM requires these to be valid, but heap does */
/* not every AM requires these to be valid, but heap does */
Assert ( TransactionIdIsNormal ( onerel - > rd_rel - > relfrozenxid ) ) ;
Assert ( TransactionIdIsNormal ( onerel - > rd_rel - > relfrozenxid ) ) ;
@ -308,7 +310,7 @@ heap_vacuum_rel(Relation onerel, VacuumParams *params,
/*
/*
* Optionally truncate the relation .
* Optionally truncate the relation .
*/
*/
if ( should_attempt_truncation ( onerel , vacrelstats ) )
if ( should_attempt_truncation ( params , vacrelstats ) )
lazy_truncate_heap ( onerel , vacrelstats ) ;
lazy_truncate_heap ( onerel , vacrelstats ) ;
/* Report that we are now doing final cleanup */
/* Report that we are now doing final cleanup */
@ -652,7 +654,7 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
/* see note above about forcing scanning of last page */
/* see note above about forcing scanning of last page */
# define FORCE_CHECK_PAGE() \
# define FORCE_CHECK_PAGE() \
( blkno = = nblocks - 1 & & should_attempt_truncation ( onerel , vacrelstats ) )
( blkno = = nblocks - 1 & & should_attempt_truncation ( params , vacrelstats ) )
pgstat_progress_update_param ( PROGRESS_VACUUM_HEAP_BLKS_SCANNED , blkno ) ;
pgstat_progress_update_param ( PROGRESS_VACUUM_HEAP_BLKS_SCANNED , blkno ) ;
@ -1845,12 +1847,11 @@ lazy_cleanup_index(Relation indrel,
* careful to depend only on fields that lazy_scan_heap updates on - the - fly .
* careful to depend only on fields that lazy_scan_heap updates on - the - fly .
*/
*/
static bool
static bool
should_attempt_truncation ( Relation rel , LVRelStats * vacrelstats )
should_attempt_truncation ( VacuumParams * params , LVRelStats * vacrelstats )
{
{
BlockNumber possibly_freeable ;
BlockNumber possibly_freeable ;
if ( rel - > rd_options ! = NULL & &
if ( params - > truncate = = VACOPT_TERNARY_DISABLED )
( ( StdRdOptions * ) rel - > rd_options ) - > vacuum_truncate = = false )
return false ;
return false ;
possibly_freeable = vacrelstats - > rel_pages - vacrelstats - > nonempty_pages ;
possibly_freeable = vacrelstats - > rel_pages - vacrelstats - > nonempty_pages ;