From a80f1b3dbd9cc0bf060673fd860e0d59d2ca2159 Mon Sep 17 00:00:00 2001 From: Melanie Plageman Date: Sun, 3 Sep 2023 16:14:56 -0400 Subject: [PATCH v0 2/3] VM update for a heap block not in SB WIP: needs to emit WAL, do error checking, and handle more conditions than it currently does --- src/backend/access/heap/visibilitymap.c | 29 +++++++++++++++++++++++++ src/include/access/visibilitymap.h | 3 +++ 2 files changed, 32 insertions(+) diff --git a/src/backend/access/heap/visibilitymap.c b/src/backend/access/heap/visibilitymap.c index 2e18cd88bc..adbc62dd7a 100644 --- a/src/backend/access/heap/visibilitymap.c +++ b/src/backend/access/heap/visibilitymap.c @@ -315,6 +315,35 @@ visibilitymap_set(Relation rel, BlockNumber heapBlk, Buffer heapBuf, LockBuffer(vmBuf, BUFFER_LOCK_UNLOCK); } +/* + * TODO: emit WAL + */ +void +visibilitymap_set_unbuffered(Relation rel, BlockNumber heap_block, + Buffer vm_buffer, uint8 flags) +{ + uint32 mapByte = HEAPBLK_TO_MAPBYTE(heap_block); + uint8 mapOffset = HEAPBLK_TO_OFFSET(heap_block); + Page page; + uint8 *map; + + page = BufferGetPage(vm_buffer); + map = (uint8 *) PageGetContents(page); + LockBuffer(vm_buffer, BUFFER_LOCK_EXCLUSIVE); + + if (flags != (map[mapByte] >> mapOffset & VISIBILITYMAP_VALID_BITS)) + { + START_CRIT_SECTION(); + + map[mapByte] |= (flags << mapOffset); + MarkBufferDirty(vm_buffer); + + END_CRIT_SECTION(); + } + + LockBuffer(vm_buffer, BUFFER_LOCK_UNLOCK); +} + /* * visibilitymap_get_status - get status of bits * diff --git a/src/include/access/visibilitymap.h b/src/include/access/visibilitymap.h index daaa01a257..83ca9b3b73 100644 --- a/src/include/access/visibilitymap.h +++ b/src/include/access/visibilitymap.h @@ -34,6 +34,9 @@ extern bool visibilitymap_pin_ok(BlockNumber heapBlk, Buffer vmbuf); extern void visibilitymap_set(Relation rel, BlockNumber heapBlk, Buffer heapBuf, XLogRecPtr recptr, Buffer vmBuf, TransactionId cutoff_xid, uint8 flags); + +extern void +visibilitymap_set_unbuffered(Relation rel, BlockNumber heap_block, Buffer vm_buffer, uint8 flags); extern uint8 visibilitymap_get_status(Relation rel, BlockNumber heapBlk, Buffer *vmbuf); extern void visibilitymap_count(Relation rel, BlockNumber *all_visible, BlockNumber *all_frozen); extern BlockNumber visibilitymap_prepare_truncate(Relation rel, -- 2.37.2