@ -155,15 +155,13 @@ heap_page_prune_opt(Relation relation, Buffer buffer)
*/
*/
if ( PageIsFull ( page ) | | PageGetHeapFreeSpace ( page ) < minfree )
if ( PageIsFull ( page ) | | PageGetHeapFreeSpace ( page ) < minfree )
{
{
int ndeleted ,
PruneResult presult ;
nnewlpdead ;
ndeleted = heap_page_prune ( relation , buffer , vistest ,
heap_page_prune ( relation , buffer , vistest , & presult , NULL ) ;
& nnewlpdead , NULL ) ;
/*
/*
* Report the number of tuples reclaimed to pgstats . This is
* Report the number of tuples reclaimed to pgstats . This is
* ndeleted minus the number of newly - LP_DEAD - set items .
* presult . ndeleted minus the number of newly - LP_DEAD - set items .
*
*
* We derive the number of dead tuples like this to avoid totally
* We derive the number of dead tuples like this to avoid totally
* forgetting about items that were set to LP_DEAD , since they
* forgetting about items that were set to LP_DEAD , since they
@ -175,9 +173,9 @@ heap_page_prune_opt(Relation relation, Buffer buffer)
* tracks ndeleted , since it will set the same LP_DEAD items to
* tracks ndeleted , since it will set the same LP_DEAD items to
* LP_UNUSED separately .
* LP_UNUSED separately .
*/
*/
if ( ndeleted > nnewlpdead )
if ( presult . ndeleted > presult . nnewlpdead )
pgstat_update_heap_dead_tuples ( relation ,
pgstat_update_heap_dead_tuples ( relation ,
ndeleted - nnewlpdead ) ;
presult . ndeleted - presult . nnewlpdead ) ;
}
}
/* And release buffer lock */
/* And release buffer lock */
@ -204,21 +202,19 @@ heap_page_prune_opt(Relation relation, Buffer buffer)
* ( see heap_prune_satisfies_vacuum and
* ( see heap_prune_satisfies_vacuum and
* HeapTupleSatisfiesVacuum ) .
* HeapTupleSatisfiesVacuum ) .
*
*
* Sets * nnewlpdead for caller , indicating the number of items that were
* newly set LP_DEAD during prune operation .
*
* off_loc is the offset location required by the caller to use in error
* off_loc is the offset location required by the caller to use in error
* callback .
* callback .
*
*
* Returns the number of tuples deleted from the page during this call .
* presult contains output parameters needed by callers such as the number of
* tuples removed and the number of line pointers newly marked LP_DEAD .
* heap_page_prune ( ) is responsible for initializing it .
*/
*/
int
void
heap_page_prune ( Relation relation , Buffer buffer ,
heap_page_prune ( Relation relation , Buffer buffer ,
GlobalVisState * vistest ,
GlobalVisState * vistest ,
int * nnewlpdead ,
PruneResult * presult ,
OffsetNumber * off_loc )
OffsetNumber * off_loc )
{
{
int ndeleted = 0 ;
Page page = BufferGetPage ( buffer ) ;
Page page = BufferGetPage ( buffer ) ;
BlockNumber blockno = BufferGetBlockNumber ( buffer ) ;
BlockNumber blockno = BufferGetBlockNumber ( buffer ) ;
OffsetNumber offnum ,
OffsetNumber offnum ,
@ -244,6 +240,9 @@ heap_page_prune(Relation relation, Buffer buffer,
prstate . nredirected = prstate . ndead = prstate . nunused = 0 ;
prstate . nredirected = prstate . ndead = prstate . nunused = 0 ;
memset ( prstate . marked , 0 , sizeof ( prstate . marked ) ) ;
memset ( prstate . marked , 0 , sizeof ( prstate . marked ) ) ;
presult - > ndeleted = 0 ;
presult - > nnewlpdead = 0 ;
maxoff = PageGetMaxOffsetNumber ( page ) ;
maxoff = PageGetMaxOffsetNumber ( page ) ;
tup . t_tableOid = RelationGetRelid ( prstate . rel ) ;
tup . t_tableOid = RelationGetRelid ( prstate . rel ) ;
@ -318,7 +317,7 @@ heap_page_prune(Relation relation, Buffer buffer,
continue ;
continue ;
/* Process this item or chain of items */
/* Process this item or chain of items */
ndeleted + = heap_prune_chain ( buffer , offnum , & prstate ) ;
presult - > ndeleted + = heap_prune_chain ( buffer , offnum , & prstate ) ;
}
}
/* Clear the offset information once we have processed the given page. */
/* Clear the offset information once we have processed the given page. */
@ -419,9 +418,7 @@ heap_page_prune(Relation relation, Buffer buffer,
END_CRIT_SECTION ( ) ;
END_CRIT_SECTION ( ) ;
/* Record number of newly-set-LP_DEAD items for caller */
/* Record number of newly-set-LP_DEAD items for caller */
* nnewlpdead = prstate . ndead ;
presult - > nnewlpdead = prstate . ndead ;
return ndeleted ;
}
}