From a80f1b3dbd9cc0bf060673fd860e0d59d2ca2159 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
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

