From cb2fa6f0245b28a1d3f83ac901eb0d8698f22dd3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Villemain?= <Cedric.Villemain@Data-Bene.io>
Date: Wed, 3 Jan 2024 20:16:37 +0100
Subject: [PATCH 3/3] Allow pg_prewarm to use new smgrreadv

This commit replaces smgrread with smgrreadv (with range).

I also defined a PREWARM_READ_RANGE, 8 by default, which is the
number of buffers to read in one call.

I just discovered pg_readv so I hope the initialization I wrote is correct.

It's not really sure there is a huge win because all blocks are sequential
and readv should merge them but not use vectorization (if I understood
correctly).
---
 contrib/pg_prewarm/pg_prewarm.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/contrib/pg_prewarm/pg_prewarm.c b/contrib/pg_prewarm/pg_prewarm.c
index aea07927db..e11694d707 100644
--- a/contrib/pg_prewarm/pg_prewarm.c
+++ b/contrib/pg_prewarm/pg_prewarm.c
@@ -26,6 +26,7 @@
 #include "utils/rel.h"
 
 #define PREWARM_PREFETCH_RANGE	RELSEG_SIZE
+#define PREWARM_READ_RANGE	8
 
 PG_MODULE_MAGIC;
 
@@ -38,7 +39,7 @@ typedef enum
 	PREWARM_BUFFER,
 } PrewarmType;
 
-static PGIOAlignedBlock blockbuffer;
+static PGIOAlignedBlock blockbuffers[PREWARM_READ_RANGE];
 
 /*
  * pg_prewarm(regclass, mode text, fork text,
@@ -187,11 +188,19 @@ pg_prewarm(PG_FUNCTION_ARGS)
 		 * buffers.  This is more portable than prefetch mode (it works
 		 * everywhere) and is synchronous.
 		 */
-		for (block = first_block; block <= last_block; ++block)
+		char	*buffers[PREWARM_READ_RANGE];
+		for (int i=0; i < PREWARM_READ_RANGE; i++)
+			buffers[i] = blockbuffers[i].data;
+		for (block = first_block; block <= last_block;
+			 block += PREWARM_READ_RANGE)
 		{
+			int seek = Min(PREWARM_READ_RANGE, (last_block - block + 1));
+
 			CHECK_FOR_INTERRUPTS();
-			smgrread(RelationGetSmgr(rel), forkNumber, block, blockbuffer.data);
-			++blocks_done;
+
+			smgrreadv(RelationGetSmgr(rel), forkNumber, block, (void *) buffers,
+					  seek);
+			blocks_done += seek;
 		}
 	}
 	else if (ptype == PREWARM_BUFFER)
-- 
2.39.2

