42 char *end = from +
len;
67 items[
i] = (
Item) from;
68 itemsizes[
i] = itemsz;
79 elog(
PANIC,
"_bt_restore_page: cannot add item to page");
213 postingoff = *((
uint16 *) datapos);
214 datapos +=
sizeof(
uint16);
215 datalen -=
sizeof(
uint16);
221 Assert(isleaf && postingoff > 0);
232 elog(
PANIC,
"failed to add posting split new item");
257 bool isleaf = (xlrec->
level == 0);
337 datapos += newitemsz;
338 datalen -= newitemsz;
364 datapos += left_hikeysz;
365 datalen -= left_hikeysz;
375 elog(
ERROR,
"failed to add high key to left page after split");
385 if (off == replacepostingoff)
392 elog(
ERROR,
"failed to add new posting list item to left page after split");
398 else if (newitemonleft && off == xlrec->
newitemoff)
402 elog(
ERROR,
"failed to add new item to left page after split");
411 elog(
ERROR,
"failed to add old item to left page after split");
416 if (newitemonleft && off == xlrec->
newitemoff)
420 elog(
ERROR,
"failed to add new item to left page after split");
438 if (spagenumber !=
P_NONE)
485 state->deduplicate =
true;
486 state->nmaxitems = 0;
491 state->basetupsize = 0;
495 state->phystupsize = 0;
496 state->nintervals = 0;
510 elog(
ERROR,
"deduplication failed to add highkey");
514 for (offnum = minoff;
521 if (offnum == minoff)
528 elog(
ERROR,
"deduplication failed to add heap tid to pending posting list");
567 for (
int i = 0;
i < nupdated;
i++)
575 vacposting->
itup = origtuple;
587 elog(
PANIC,
"failed to update partially dead item");
791 elog(
ERROR,
"could not add dummy high key to half-dead page");
817 level = xlrec->
level;
818 isleaf = (level == 0);
926 elog(
ERROR,
"could not add dummy high key to half-dead page");
958 if (xlrec->
level == 0)
962 if (xlrec->
level > 0)
1068 elog(
PANIC,
"btree_redo: unknown op code %u", info);
1078 "Btree recovery temporary context",
static bool BlockNumberIsValid(BlockNumber blockNumber)
void mask_lp_flags(Page page)
void mask_page_lsn_and_checksum(Page page)
void mask_unused_space(Page page)
void mask_page_hint_bits(Page page)
BlockNumber BufferGetBlockNumber(Buffer buffer)
void UnlockReleaseBuffer(Buffer buffer)
void MarkBufferDirty(Buffer buffer)
static Page BufferGetPage(Buffer buffer)
static Size BufferGetPageSize(Buffer buffer)
static bool BufferIsValid(Buffer bufnum)
void PageRestoreTempPage(Page tempPage, Page oldPage)
void PageIndexMultiDelete(Page page, OffsetNumber *itemnos, int nitems)
Page PageGetTempPageCopySpecial(Page page)
bool PageIndexTupleOverwrite(Page page, OffsetNumber offnum, Item newtup, Size newsize)
void PageIndexTupleDelete(Page page, OffsetNumber offnum)
PageHeaderData * PageHeader
static Item PageGetItem(Page page, ItemId itemId)
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
static void PageSetLSN(Page page, XLogRecPtr lsn)
static OffsetNumber PageGetMaxOffsetNumber(Page page)
#define PageAddItem(page, item, size, offsetNumber, overwrite, is_heap)
#define MemSet(start, val, len)
elog(ERROR, "%s: %s", p2, msg)
IndexTuple CopyIndexTuple(IndexTuple source)
#define ItemIdGetLength(itemId)
IndexTupleData * IndexTuple
#define IndexTupleSize(itup)
struct IndexTupleData IndexTupleData
#define MaxIndexTuplesPerPage
Assert(fmt[strlen(fmt) - 1] !='\n')
void MemoryContextReset(MemoryContext context)
void pfree(void *pointer)
MemoryContext CurrentMemoryContext
void MemoryContextDelete(MemoryContext context)
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
IndexTuple _bt_swap_posting(IndexTuple newitem, IndexTuple oposting, int postingoff)
void _bt_update_posting(BTVacuumPosting vacposting)
bool _bt_dedup_save_htid(BTDedupState state, IndexTuple itup)
void _bt_dedup_start_pending(BTDedupState state, IndexTuple base, OffsetNumber baseoff)
Size _bt_dedup_finish_pending(Page newpage, BTDedupState state)
void _bt_pageinit(Page page, Size size)
#define P_HAS_GARBAGE(opaque)
static void BTreeTupleSetTopParent(IndexTuple leafhikey, BlockNumber blkno)
#define BTPageGetOpaque(page)
static void BTreeTupleSetDownLink(IndexTuple pivot, BlockNumber blkno)
#define P_FIRSTDATAKEY(opaque)
#define P_RIGHTMOST(opaque)
#define BTMaxItemSize(page)
#define P_INCOMPLETE_SPLIT(opaque)
#define BTP_INCOMPLETE_SPLIT
static BlockNumber BTreeTupleGetDownLink(IndexTuple pivot)
static void BTPageSetDeleted(Page page, FullTransactionId safexid)
#define BTREE_NOVAC_VERSION
BTDedupStateData * BTDedupState
static void btree_xlog_delete(XLogReaderState *record)
void btree_redo(XLogReaderState *record)
static void _bt_restore_meta(XLogReaderState *record, uint8 block_id)
void btree_xlog_cleanup(void)
static void btree_xlog_newroot(XLogReaderState *record)
static void btree_xlog_updates(Page page, OffsetNumber *updatedoffsets, xl_btree_update *updates, int nupdated)
static void btree_xlog_dedup(XLogReaderState *record)
static void btree_xlog_insert(bool isleaf, bool ismeta, bool posting, XLogReaderState *record)
static void btree_xlog_split(bool newitemonleft, XLogReaderState *record)
static void btree_xlog_reuse_page(XLogReaderState *record)
static void _bt_clear_incomplete_split(XLogReaderState *record, uint8 block_id)
static void btree_xlog_mark_page_halfdead(uint8 info, XLogReaderState *record)
static void _bt_restore_page(Page page, char *from, int len)
void btree_mask(char *pagedata, BlockNumber blkno)
static MemoryContext opCtx
void btree_xlog_startup(void)
static void btree_xlog_vacuum(XLogReaderState *record)
static void btree_xlog_unlink_page(uint8 info, XLogReaderState *record)
#define XLOG_BTREE_META_CLEANUP
#define XLOG_BTREE_INSERT_POST
#define SizeOfBtreeUpdate
#define XLOG_BTREE_VACUUM
#define XLOG_BTREE_SPLIT_R
#define XLOG_BTREE_INSERT_LEAF
#define XLOG_BTREE_INSERT_UPPER
#define XLOG_BTREE_UNLINK_PAGE
#define XLOG_BTREE_UNLINK_PAGE_META
#define XLOG_BTREE_INSERT_META
#define XLOG_BTREE_MARK_PAGE_HALFDEAD
#define XLOG_BTREE_REUSE_PAGE
#define XLOG_BTREE_SPLIT_L
#define XLOG_BTREE_NEWROOT
#define XLOG_BTREE_DELETE
#define InvalidOffsetNumber
#define OffsetNumberNext(offsetNumber)
#define OffsetNumberPrev(offsetNumber)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
void ResolveRecoveryConflictWithSnapshotFullXid(FullTransactionId snapshotConflictHorizon, bool isCatalogRel, RelFileLocator locator)
void ResolveRecoveryConflictWithSnapshot(TransactionId snapshotConflictHorizon, bool isCatalogRel, RelFileLocator locator)
uint32 btm_last_cleanup_num_delpages
float8 btm_last_cleanup_num_heap_tuples
uint16 deletetids[FLEXIBLE_ARRAY_MEMBER]
OffsetNumber updatedoffset
TransactionId snapshotConflictHorizon
FullTransactionId snapshotConflictHorizon
OffsetNumber firstrightoff
FullTransactionId safexid
BlockNumber leaftopparent
bool XLogRecGetBlockTagExtended(XLogReaderState *record, uint8 block_id, RelFileLocator *rlocator, ForkNumber *forknum, BlockNumber *blknum, Buffer *prefetch_buffer)
void XLogRecGetBlockTag(XLogReaderState *record, uint8 block_id, RelFileLocator *rlocator, ForkNumber *forknum, BlockNumber *blknum)
char * XLogRecGetBlockData(XLogReaderState *record, uint8 block_id, Size *len)
#define XLogRecGetInfo(decoder)
#define XLogRecGetData(decoder)
#define XLogRecHasBlockRef(decoder, block_id)
XLogRedoAction XLogReadBufferForRedo(XLogReaderState *record, uint8 block_id, Buffer *buf)
Buffer XLogInitBufferForRedo(XLogReaderState *record, uint8 block_id)
XLogRedoAction XLogReadBufferForRedoExtended(XLogReaderState *record, uint8 block_id, ReadBufferMode mode, bool get_cleanup_lock, Buffer *buf)