108 #define MAPSIZE (BLCKSZ - MAXALIGN(SizeOfPageHeaderData))
111 #define HEAPBLOCKS_PER_BYTE (BITS_PER_BYTE / BITS_PER_HEAPBLOCK)
114 #define HEAPBLOCKS_PER_PAGE (MAPSIZE * HEAPBLOCKS_PER_BYTE)
117 #define HEAPBLK_TO_MAPBLOCK(x) ((x) / HEAPBLOCKS_PER_PAGE)
118 #define HEAPBLK_TO_MAPBYTE(x) (((x) % HEAPBLOCKS_PER_PAGE) / HEAPBLOCKS_PER_BYTE)
119 #define HEAPBLK_TO_OFFSET(x) (((x) % HEAPBLOCKS_PER_BYTE) * BITS_PER_HEAPBLOCK)
122 #define VISIBLE_MASK64 UINT64CONST(0x5555555555555555)
124 #define FROZEN_MASK64 UINT64CONST(0xaaaaaaaaaaaaaaaa)
145 uint8 mask = flags << mapOffset;
147 bool cleared =
false;
153 #ifdef TRACE_VISIBILITYMAP
158 elog(
ERROR,
"wrong buffer passed to visibilitymap_clear");
163 if (map[mapByte] & mask)
165 map[mapByte] &= ~mask;
256 #ifdef TRACE_VISIBILITYMAP
269 elog(
ERROR,
"wrong heap buffer passed to visibilitymap_set");
273 elog(
ERROR,
"wrong VM buffer passed to visibilitymap_set");
283 map[mapByte] |= (flags << mapOffset);
346 #ifdef TRACE_VISIBILITYMAP
395 for (mapBlock = 0;; mapBlock++)
418 "unsupported MAPSIZE");
419 if (all_frozen == NULL)
421 for (
i = 0;
i <
MAPSIZE /
sizeof(uint64);
i++)
426 for (
i = 0;
i <
MAPSIZE /
sizeof(uint64);
i++)
436 *all_visible = nvisible;
438 *all_frozen = nfrozen;
462 #ifdef TRACE_VISIBILITYMAP
480 if (truncByte != 0 || truncOffset != 0)
486 newnblocks = truncBlock + 1;
488 mapBuffer =
vm_readbuf(rel, truncBlock,
false);
516 map[truncByte] &= (1 << truncOffset) - 1;
535 newnblocks = truncBlock;
#define InvalidBlockNumber
BlockNumber BufferGetBlockNumber(Buffer buffer)
Buffer ExtendBufferedRelTo(BufferManagerRelation bmr, ForkNumber fork, BufferAccessStrategy strategy, uint32 flags, BlockNumber extend_to, ReadBufferMode mode)
void ReleaseBuffer(Buffer buffer)
void UnlockReleaseBuffer(Buffer buffer)
void MarkBufferDirty(Buffer buffer)
void LockBuffer(Buffer buffer, int mode)
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
#define BUFFER_LOCK_UNLOCK
static Page BufferGetPage(Buffer buffer)
@ EB_CREATE_FORK_IF_NEEDED
#define BUFFER_LOCK_EXCLUSIVE
static bool BufferIsValid(Buffer bufnum)
void PageInit(Page page, Size pageSize, Size specialSize)
static char * PageGetContents(Page page)
static bool PageIsNew(Page page)
static bool PageIsAllVisible(Page page)
static void PageSetLSN(Page page, XLogRecPtr lsn)
#define MemSet(start, val, len)
#define StaticAssertStmt(condition, errmessage)
elog(ERROR, "%s: %s", p2, msg)
XLogRecPtr log_heap_visible(Relation rel, Buffer heap_buffer, Buffer vm_buffer, TransactionId snapshotConflictHorizon, uint8 vmflags)
void CacheInvalidateSmgr(RelFileLocatorBackend rlocator)
Assert(fmt[strlen(fmt) - 1] !='\n')
#define START_CRIT_SECTION()
#define END_CRIT_SECTION()
int pg_popcount64(uint64 word)
static SMgrRelation RelationGetSmgr(Relation rel)
#define RelationGetRelationName(relation)
#define RelationNeedsWAL(relation)
BlockNumber smgrnblocks(SMgrRelation reln, ForkNumber forknum)
bool smgrexists(SMgrRelation reln, ForkNumber forknum)
BlockNumber smgr_cached_nblocks[MAX_FORKNUM+1]
void visibilitymap_set(Relation rel, BlockNumber heapBlk, Buffer heapBuf, XLogRecPtr recptr, Buffer vmBuf, TransactionId cutoff_xid, uint8 flags)
bool visibilitymap_pin_ok(BlockNumber heapBlk, Buffer vmbuf)
bool visibilitymap_clear(Relation rel, BlockNumber heapBlk, Buffer vmbuf, uint8 flags)
#define HEAPBLK_TO_OFFSET(x)
void visibilitymap_pin(Relation rel, BlockNumber heapBlk, Buffer *vmbuf)
uint8 visibilitymap_get_status(Relation rel, BlockNumber heapBlk, Buffer *vmbuf)
static Buffer vm_extend(Relation rel, BlockNumber vm_nblocks)
BlockNumber visibilitymap_prepare_truncate(Relation rel, BlockNumber nheapblocks)
void visibilitymap_count(Relation rel, BlockNumber *all_visible, BlockNumber *all_frozen)
static Buffer vm_readbuf(Relation rel, BlockNumber blkno, bool extend)
#define HEAPBLK_TO_MAPBLOCK(x)
#define HEAPBLK_TO_MAPBYTE(x)
#define VISIBILITYMAP_VALID_BITS
#define VISIBILITYMAP_ALL_FROZEN
#define VISIBILITYMAP_ALL_VISIBLE
#define XLogHintBitIsNeeded()
#define XLogRecPtrIsInvalid(r)
XLogRecPtr log_newpage_buffer(Buffer buffer, bool page_std)