136 minfree =
Max(minfree, BLCKSZ / 10);
216 if (prstate.
marked[offnum])
303 if (report_stats && ndeleted > prstate.
ndead)
431 if (offnum < FirstOffsetNumber || offnum > maxoff)
435 if (prstate->
marked[offnum])
453 chainitems[nchain++] = offnum;
483 chainitems[nchain++] = offnum;
488 tupdead = recent_dead =
false;
529 elog(
ERROR,
"unexpected HeapTupleSatisfiesVacuum result");
546 else if (!recent_dead)
579 for (
i = 1; (
i < nchain) && (chainitems[
i - 1] != latestdead);
i++)
642 prstate->
marked[offnum] =
true;
644 prstate->
marked[rdoffnum] =
true;
655 prstate->
marked[offnum] =
true;
666 prstate->
marked[offnum] =
true;
691 for (i = 0; i < nredirected; i++)
702 for (i = 0; i < ndead; i++)
712 for (i = 0; i < nunused; i++)
779 root_offsets[offnum - 1] = offnum;
821 root_offsets[nextoffnum - 1] = offnum;
#define HeapTupleHeaderGetUpdateXid(tup)
void HeapTupleHeaderAdvanceLatestRemovedXid(HeapTupleHeader tuple, TransactionId *latestRemovedXid)
static int heap_prune_chain(Relation relation, Buffer buffer, OffsetNumber rootoffnum, TransactionId OldestXmin, PruneState *prstate)
#define BUFFER_LOCK_UNLOCK
int heap_page_prune(Relation relation, Buffer buffer, TransactionId OldestXmin, bool report_stats, TransactionId *latestRemovedXid)
bool IsCatalogRelation(Relation relation)
#define ItemIdIsRedirected(itemId)
#define TransactionIdEquals(id1, id2)
void pgstat_update_heap_dead_tuples(Relation rel, int delta)
void MarkBufferDirtyHint(Buffer buffer, bool buffer_std)
void MarkBufferDirty(Buffer buffer)
HeapTupleHeaderData * HeapTupleHeader
#define ItemIdGetRedirect(itemId)
#define END_CRIT_SECTION()
#define ItemIdIsUsed(itemId)
TransactionId TransactionIdLimitedForOldSnapshots(TransactionId recentXmin, Relation relation)
#define MaxHeapTuplesPerPage
HTSV_Result HeapTupleSatisfiesVacuum(HeapTuple htup, TransactionId OldestXmin, Buffer buffer)
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum)
#define START_CRIT_SECTION()
#define MemSet(start, val, len)
OffsetNumber nowdead[MaxHeapTuplesPerPage]
bool RecoveryInProgress(void)
#define ItemIdIsDead(itemId)
bool marked[MaxHeapTuplesPerPage+1]
#define PageGetMaxOffsetNumber(page)
TransactionId new_prune_xid
#define HeapTupleHeaderIsHeapOnly(tup)
#define ItemIdGetLength(itemId)
bool ConditionalLockBufferForCleanup(Buffer buffer)
Size PageGetHeapFreeSpace(Page page)
static void heap_prune_record_prunable(PruneState *prstate, TransactionId xid)
TransactionId RecentGlobalXmin
TransactionId latestRemovedXid
#define ItemIdSetRedirect(itemId, link)
#define FirstOffsetNumber
#define InvalidTransactionId
static TransactionId OldestXmin
#define BufferGetPage(buffer)
TransactionId RecentGlobalDataXmin
void heap_get_root_tuples(Page page, OffsetNumber *root_offsets)
#define PageClearFull(page)
bool TransactionIdPrecedes(TransactionId id1, TransactionId id2)
#define RelationGetTargetPageFreeSpace(relation, defaultff)
#define HeapTupleHeaderIsHotUpdated(tup)
#define PageGetItemId(page, offsetNumber)
#define RelationIsAccessibleInLogicalDecoding(relation)
void LockBuffer(Buffer buffer, int mode)
#define InvalidOffsetNumber
void heap_page_prune_execute(Buffer buffer, OffsetNumber *redirected, int nredirected, OffsetNumber *nowdead, int ndead, OffsetNumber *nowunused, int nunused)
PageHeaderData * PageHeader
#define Assert(condition)
static void heap_prune_record_redirect(PruneState *prstate, OffsetNumber offnum, OffsetNumber rdoffnum)
#define ItemIdIsNormal(itemId)
#define HeapTupleHeaderGetXmin(tup)
#define OffsetNumberNext(offsetNumber)
OffsetNumber nowunused[MaxHeapTuplesPerPage]
XLogRecPtr log_heap_clean(Relation reln, Buffer buffer, OffsetNumber *redirected, int nredirected, OffsetNumber *nowdead, int ndead, OffsetNumber *nowunused, int nunused, TransactionId latestRemovedXid)
#define ItemPointerGetOffsetNumber(pointer)
#define RelationNeedsWAL(relation)
#define PageIsPrunable(page, oldestxmin)
OffsetNumber redirected[MaxHeapTuplesPerPage *2]
BlockNumber BufferGetBlockNumber(Buffer buffer)
void PageRepairFragmentation(Page page)
#define OffsetNumberIsValid(offsetNumber)
#define ItemIdSetDead(itemId)
void heap_page_prune_opt(Relation relation, Buffer buffer)
#define ItemPointerGetBlockNumber(pointer)
#define HEAP_DEFAULT_FILLFACTOR
#define TransactionIdIsValid(xid)
#define ItemIdSetUnused(itemId)
#define TransactionIdIsNormal(xid)
#define PageSetLSN(page, lsn)
#define RelationGetRelid(relation)
#define PageGetItem(page, itemId)
#define ItemPointerSet(pointer, blockNumber, offNum)
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum)