160 bds->stats->tuples_removed += 1;
167 bds->stats->num_index_tuples += 1;
177 elog(
ERROR,
"inconsistent tuple chain links in page %u of index \"%s\"",
265 elog(
ERROR,
"unexpected SPGiST tuple state: %d",
273 xlrec.nPlaceholder++;
326 elog(
ERROR,
"inconsistent counts of deletable tuples");
432 bds->stats->tuples_removed += 1;
438 bds->stats->num_index_tuples += 1;
444 elog(
ERROR,
"unexpected SPGiST tuple state: %d",
449 if (
xlrec.nDelete == 0)
509 xlrec.nToPlaceholder = 0;
549 xlrec.snapshotConflictHorizon =
dt->xid;
554 xlrec.nToPlaceholder++;
562 firstPlaceholder =
i;
580 for (
i = firstPlaceholder;
i <= max;
i++)
583 i = max - firstPlaceholder + 1;
593 xlrec.firstPlaceholder = firstPlaceholder;
672 bds->stats->pages_deleted++;
677 bds->lastFilledBlock = blkno;
721 elog(
ERROR,
"redirection leads to root page of index \"%s\"",
782 elog(
ERROR,
"unexpected SPGiST tuple state: %d",
818 bds->stats->estimated_count =
false;
819 bds->stats->num_index_tuples = 0;
820 bds->stats->pages_deleted = 0;
908 if (
bds->stats->pages_deleted > 0)
925 if (num_pages >
bds->lastFilledBlock + 1)
929 num_pages =
bds->lastFilledBlock + 1;
937 bds->stats->num_pages = num_pages;
938 bds->stats->pages_newly_deleted =
bds->stats->pages_deleted;
939 bds->stats->pages_free =
bds->stats->pages_deleted;
961 bds.callback_state = callback_state;
#define InvalidBlockNumber
BlockNumber BufferGetBlockNumber(Buffer buffer)
void UnlockReleaseBuffer(Buffer buffer)
void MarkBufferDirty(Buffer buffer)
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
#define RelationGetNumberOfBlocks(reln)
static Page BufferGetPage(Buffer buffer)
static void LockBuffer(Buffer buffer, BufferLockMode mode)
static bool BufferIsValid(Buffer bufnum)
void PageIndexMultiDelete(Page page, OffsetNumber *itemnos, int nitems)
static bool PageIsEmpty(const PageData *page)
static bool PageIsNew(const PageData *page)
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
static void * PageGetItem(PageData *page, const ItemIdData *itemId)
static void PageSetLSN(Page page, XLogRecPtr lsn)
static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)
#define Assert(condition)
#define palloc_object(type)
#define palloc0_object(type)
bool(* IndexBulkDeleteCallback)(ItemPointer itemptr, void *state)
void IndexFreeSpaceMapVacuum(Relation rel)
void RecordFreeIndexPage(Relation rel, BlockNumber freeBlock)
bool ItemPointerEquals(const ItemPointerData *pointer1, const ItemPointerData *pointer2)
static void ItemPointerSetInvalid(ItemPointerData *pointer)
static OffsetNumber ItemPointerGetOffsetNumber(const ItemPointerData *pointer)
static BlockNumber ItemPointerGetBlockNumber(const ItemPointerData *pointer)
static bool ItemPointerIsValid(const ItemPointerData *pointer)
#define MaxIndexTuplesPerPage
void LockRelationForExtension(Relation relation, LOCKMODE lockmode)
void UnlockRelationForExtension(Relation relation, LOCKMODE lockmode)
void pfree(void *pointer)
#define START_CRIT_SECTION()
#define END_CRIT_SECTION()
#define InvalidOffsetNumber
#define FirstOffsetNumber
static char buf[DEFAULT_XLOG_SEG_SIZE]
bool GlobalVisTestIsRemovableXid(GlobalVisState *state, TransactionId xid)
GlobalVisState * GlobalVisTestFor(Relation rel)
void read_stream_reset(ReadStream *stream)
Buffer read_stream_next_buffer(ReadStream *stream, void **per_buffer_data)
ReadStream * read_stream_begin_relation(int flags, BufferAccessStrategy strategy, Relation rel, ForkNumber forknum, ReadStreamBlockNumberCB callback, void *callback_private_data, size_t per_buffer_data_size)
void read_stream_end(ReadStream *stream)
BlockNumber block_range_read_stream_cb(ReadStream *stream, void *callback_private_data, void *per_buffer_data)
#define READ_STREAM_MAINTENANCE
#define READ_STREAM_USE_BATCHING
#define RELATION_IS_LOCAL(relation)
#define RelationGetRelationName(relation)
#define RelationIsAccessibleInLogicalDecoding(relation)
#define RelationNeedsWAL(relation)
Snapshot GetActiveSnapshot(void)
void spgPageIndexMultiDelete(SpGistState *state, Page page, OffsetNumber *itemnos, int nitems, int firststate, int reststate, BlockNumber blkno, OffsetNumber offnum)
SpGistDeadTupleData * SpGistDeadTuple
SpGistInnerTupleData * SpGistInnerTuple
#define SGLT_GET_NEXTOFFSET(spgLeafTuple)
#define SPGIST_PLACEHOLDER
#define SGITITERATE(x, i, nt)
#define SpGistPageIsLeaf(page)
#define SPGIST_METAPAGE_BLKNO
#define SpGistPageIsDeleted(page)
#define SGLT_SET_NEXTOFFSET(spgLeafTuple, offsetNumber)
#define SpGistBlockIsRoot(blkno)
struct SpGistLeafTupleData * SpGistLeafTuple
#define STORE_STATE(s, d)
#define SpGistPageGetOpaque(page)
#define SPGIST_LAST_FIXED_BLKNO
void initSpGistState(SpGistState *state, Relation index)
void SpGistUpdateMetaPage(Relation index)
void SpGistSetLastUsedPage(Relation index, Buffer buffer)
static void vacuumRedirectAndPlaceholder(Relation index, Relation heaprel, Buffer buffer)
static void spgAddPendingTID(spgBulkDeleteState *bds, const ItemPointerData *tid)
IndexBulkDeleteResult * spgbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, IndexBulkDeleteCallback callback, void *callback_state)
static bool dummy_callback(ItemPointer itemptr, void *state)
static void vacuumLeafPage(spgBulkDeleteState *bds, Relation index, Buffer buffer, bool forPending)
IndexBulkDeleteResult * spgvacuumcleanup(IndexVacuumInfo *info, IndexBulkDeleteResult *stats)
static void spgvacuumscan(spgBulkDeleteState *bds)
static void spgprocesspending(spgBulkDeleteState *bds)
static void vacuumLeafRoot(spgBulkDeleteState *bds, Relation index, Buffer buffer)
static void spgClearPendingList(spgBulkDeleteState *bds)
static void spgvacuumpage(spgBulkDeleteState *bds, Buffer buffer)
#define XLOG_SPGIST_VACUUM_ROOT
#define SizeOfSpgxlogVacuumLeaf
#define SizeOfSpgxlogVacuumRedirect
#define XLOG_SPGIST_VACUUM_LEAF
#define XLOG_SPGIST_VACUUM_REDIRECT
#define SizeOfSpgxlogVacuumRoot
void RelationTruncate(Relation rel, BlockNumber nblocks)
BlockNumber last_exclusive
BlockNumber current_blocknum
IndexBulkDeleteResult * stats
IndexBulkDeleteCallback callback
spgVacPendingItem * pendingList
BlockNumber lastFilledBlock
struct spgVacPendingItem * next
static void callback(struct sockaddr *addr, struct sockaddr *mask, void *unused)
#define InvalidTransactionId
static bool TransactionIdFollowsOrEquals(TransactionId id1, TransactionId id2)
#define TransactionIdIsValid(xid)
static bool TransactionIdPrecedes(TransactionId id1, TransactionId id2)
void vacuum_delay_point(bool is_analyze)
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
void XLogRegisterData(const void *data, uint32 len)
void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
void XLogBeginInsert(void)