v22-0009-Remove-hard-coded-128.patch

text/x-patch

Filename: v22-0009-Remove-hard-coded-128.patch
Type: text/x-patch
Part: 8
Message: Re: [PoC] Improve dead tuple storage for lazy vacuum

Patch

Format: format-patch
Series: patch v22-0009
Subject: Remove hard-coded 128
File+
src/include/lib/radixtree_delete_impl.h 2 2
src/include/lib/radixtree.h 13 6
src/include/lib/radixtree_insert_impl.h 2 2
src/include/lib/radixtree_search_impl.h 2 2
From e3c3cae8de8db407334aa5f16d187b69baea6279 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Fri, 20 Jan 2023 15:51:21 +0700
Subject: [PATCH v22 09/22] Remove hard-coded 128

Also comment that 64 could be a valid number of bits
in the bitmap for this node type.

TODO: Consider whether we should in fact limit this
node to ~64.

In passing, remove "125" from invalid-slot-index macro.
---
 src/include/lib/radixtree.h             | 19 +++++++++++++------
 src/include/lib/radixtree_delete_impl.h |  4 ++--
 src/include/lib/radixtree_insert_impl.h |  4 ++--
 src/include/lib/radixtree_search_impl.h |  4 ++--
 4 files changed, 19 insertions(+), 12 deletions(-)

diff --git a/src/include/lib/radixtree.h b/src/include/lib/radixtree.h
index 172d62c6b0..d15ea8f0fe 100644
--- a/src/include/lib/radixtree.h
+++ b/src/include/lib/radixtree.h
@@ -270,8 +270,15 @@ RT_SCOPE void RT_STATS(RT_RADIX_TREE *tree);
 /* Tree level the radix tree uses */
 #define RT_MAX_LEVEL	((sizeof(uint64) * BITS_PER_BYTE) / RT_NODE_SPAN)
 
+/*
+ * Number of bits necessary for isset array in the slot-index node.
+ * Since bitmapword can be 64 bits, the only values that make sense
+ * here are 64 and 128.
+ */
+#define RT_SLOT_IDX_LIMIT (RT_NODE_MAX_SLOTS / 2)
+
 /* Invalid index used in node-125 */
-#define RT_NODE_125_INVALID_IDX	0xFF
+#define RT_INVALID_SLOT_IDX	0xFF
 
 /* Get a chunk from the key */
 #define RT_GET_KEY_CHUNK(key, shift) ((uint8) (((key) >> (shift)) & RT_CHUNK_MASK))
@@ -409,7 +416,7 @@ typedef struct RT_NODE_BASE_125
 	uint8		slot_idxs[RT_NODE_MAX_SLOTS];
 
 	/* isset is a bitmap to track which slot is in use */
-	bitmapword		isset[BM_IDX(128)];
+	bitmapword		isset[BM_IDX(RT_SLOT_IDX_LIMIT)];
 } RT_NODE_BASE_125;
 
 typedef struct RT_NODE_BASE_256
@@ -867,7 +874,7 @@ RT_CHUNK_VALUES_ARRAY_COPY(uint8 *src_chunks, RT_VALUE_TYPE *src_values,
 static inline bool
 RT_NODE_125_IS_CHUNK_USED(RT_NODE_BASE_125 *node, uint8 chunk)
 {
-	return node->slot_idxs[chunk] != RT_NODE_125_INVALID_IDX;
+	return node->slot_idxs[chunk] != RT_INVALID_SLOT_IDX;
 }
 
 static inline RT_PTR_ALLOC
@@ -881,7 +888,7 @@ static inline RT_VALUE_TYPE
 RT_NODE_LEAF_125_GET_VALUE(RT_NODE_LEAF_125 *node, uint8 chunk)
 {
 	Assert(NODE_IS_LEAF(node));
-	Assert(((RT_NODE_BASE_125 *) node)->slot_idxs[chunk] != RT_NODE_125_INVALID_IDX);
+	Assert(((RT_NODE_BASE_125 *) node)->slot_idxs[chunk] != RT_INVALID_SLOT_IDX);
 	return node->values[node->base.slot_idxs[chunk]];
 }
 
@@ -1037,7 +1044,7 @@ RT_INIT_NODE(RT_PTR_LOCAL node, uint8 kind, RT_SIZE_CLASS size_class, bool inner
 	{
 		RT_NODE_BASE_125 *n125 = (RT_NODE_BASE_125 *) node;
 
-		memset(n125->slot_idxs, RT_NODE_125_INVALID_IDX, sizeof(n125->slot_idxs));
+		memset(n125->slot_idxs, RT_INVALID_SLOT_IDX, sizeof(n125->slot_idxs));
 	}
 }
 
@@ -2052,7 +2059,7 @@ RT_DUMP_NODE(RT_PTR_LOCAL node, int level, bool recurse)
 					RT_NODE_LEAF_125 *n = (RT_NODE_LEAF_125 *) node;
 
 					fprintf(stderr, ", isset-bitmap:");
-					for (int i = 0; i < BM_IDX(128); i++)
+					for (int i = 0; i < BM_IDX(RT_SLOT_IDX_LIMIT); i++)
 					{
 						fprintf(stderr, UINT64_FORMAT_HEX " ", (uint64) n->base.isset[i]);
 					}
diff --git a/src/include/lib/radixtree_delete_impl.h b/src/include/lib/radixtree_delete_impl.h
index 2612730481..2f1c172672 100644
--- a/src/include/lib/radixtree_delete_impl.h
+++ b/src/include/lib/radixtree_delete_impl.h
@@ -65,13 +65,13 @@
 				int			idx;
 				int			bitnum;
 
-				if (slotpos == RT_NODE_125_INVALID_IDX)
+				if (slotpos == RT_INVALID_SLOT_IDX)
 					return false;
 
 				idx = BM_IDX(slotpos);
 				bitnum = BM_BIT(slotpos);
 				n125->base.isset[idx] &= ~((bitmapword) 1 << bitnum);
-				n125->base.slot_idxs[chunk] = RT_NODE_125_INVALID_IDX;
+				n125->base.slot_idxs[chunk] = RT_INVALID_SLOT_IDX;
 
 				break;
 			}
diff --git a/src/include/lib/radixtree_insert_impl.h b/src/include/lib/radixtree_insert_impl.h
index e3e44669ea..90fe5f539e 100644
--- a/src/include/lib/radixtree_insert_impl.h
+++ b/src/include/lib/radixtree_insert_impl.h
@@ -201,7 +201,7 @@
 				int			slotpos = n125->base.slot_idxs[chunk];
 				int			cnt = 0;
 
-				if (slotpos != RT_NODE_125_INVALID_IDX)
+				if (slotpos != RT_INVALID_SLOT_IDX)
 				{
 					/* found the existing chunk */
 					chunk_exists = true;
@@ -247,7 +247,7 @@
 					bitmapword	inverse;
 
 					/* get the first word with at least one bit not set */
-					for (idx = 0; idx < BM_IDX(128); idx++)
+					for (idx = 0; idx < BM_IDX(RT_SLOT_IDX_LIMIT); idx++)
 					{
 						if (n125->base.isset[idx] < ~((bitmapword) 0))
 							break;
diff --git a/src/include/lib/radixtree_search_impl.h b/src/include/lib/radixtree_search_impl.h
index 365abaa46d..d2bbdd2450 100644
--- a/src/include/lib/radixtree_search_impl.h
+++ b/src/include/lib/radixtree_search_impl.h
@@ -73,10 +73,10 @@
 				int			slotpos = n125->base.slot_idxs[chunk];
 
 #ifdef RT_ACTION_UPDATE
-				Assert(slotpos != RT_NODE_125_INVALID_IDX);
+				Assert(slotpos != RT_INVALID_SLOT_IDX);
 				n125->children[slotpos] = new_child;
 #else
-				if (slotpos == RT_NODE_125_INVALID_IDX)
+				if (slotpos == RT_INVALID_SLOT_IDX)
 					return false;
 
 #ifdef RT_NODE_LEVEL_LEAF
-- 
2.39.0