0005-XXX-read_buffer_loop.patch
text/x-patch
Filename: 0005-XXX-read_buffer_loop.patch
Type: text/x-patch
Part: 4
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch 0005
Subject: XXX read_buffer_loop
| File | + | − |
|---|---|---|
| src/test/modules/test_aio/test_aio--1.0.sql | 4 | 0 |
| src/test/modules/test_aio/test_aio.c | 59 | 0 |
From 43fea48f5f6e9b3301a0216f0402b2558862d632 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@gmail.com>
Date: Sat, 5 Apr 2025 11:14:26 +1300
Subject: [PATCH 5/5] XXX read_buffer_loop
select read_buffer_loop(n) with different values of n in each
session to test latency of reading one block.
---
src/test/modules/test_aio/test_aio--1.0.sql | 4 ++
src/test/modules/test_aio/test_aio.c | 59 +++++++++++++++++++++
2 files changed, 63 insertions(+)
diff --git a/src/test/modules/test_aio/test_aio--1.0.sql b/src/test/modules/test_aio/test_aio--1.0.sql
index e495481c41e..c37b38afcb0 100644
--- a/src/test/modules/test_aio/test_aio--1.0.sql
+++ b/src/test/modules/test_aio/test_aio--1.0.sql
@@ -106,3 +106,7 @@ AS 'MODULE_PATHNAME' LANGUAGE C;
CREATE FUNCTION inj_io_reopen_detach()
RETURNS pg_catalog.void STRICT
AS 'MODULE_PATHNAME' LANGUAGE C;
+
+CREATE FUNCTION read_buffer_loop(block int)
+RETURNS pg_catalog.void STRICT
+AS 'MODULE_PATHNAME' LANGUAGE C;
diff --git a/src/test/modules/test_aio/test_aio.c b/src/test/modules/test_aio/test_aio.c
index 1d776010ef4..2654302a13c 100644
--- a/src/test/modules/test_aio/test_aio.c
+++ b/src/test/modules/test_aio/test_aio.c
@@ -18,6 +18,8 @@
#include "postgres.h"
+#include <math.h>
+
#include "access/relation.h"
#include "fmgr.h"
#include "storage/aio.h"
@@ -27,6 +29,7 @@
#include "storage/checksum.h"
#include "storage/ipc.h"
#include "storage/lwlock.h"
+#include "storage/read_stream.h"
#include "utils/builtins.h"
#include "utils/injection_point.h"
#include "utils/rel.h"
@@ -806,3 +809,59 @@ inj_io_reopen_detach(PG_FUNCTION_ARGS)
#endif
PG_RETURN_VOID();
}
+
+static BlockNumber
+zero_callback(ReadStream *stream, void *user_data, void *pbd)
+{
+ return *(BlockNumber *) user_data;
+}
+
+PG_FUNCTION_INFO_V1(read_buffer_loop);
+Datum
+read_buffer_loop(PG_FUNCTION_ARGS)
+{
+ BlockNumber block = PG_GETARG_UINT32(0);
+ Relation rel;
+ ReadStream *stream;
+ Buffer buffer;
+ TimestampTz start;
+
+ rel = relation_open(TypeRelationId, AccessShareLock);
+ stream = read_stream_begin_relation(0, NULL, rel, MAIN_FORKNUM, zero_callback, &block, 0);
+ for (int loop = 0; loop < 10; loop++)
+ {
+ double samples[25000];
+ double avg = 0;
+ double sum = 0;
+ double var = 0;
+ double dev;
+ double stddev;
+
+ for (int i = 0; i < lengthof(samples); ++i)
+ {
+ bool flushed;
+
+ start = GetCurrentTimestamp();
+ buffer = read_stream_next_buffer(stream, NULL);
+ samples[i] = GetCurrentTimestamp() - start;
+ sum += samples[i];
+
+ ReleaseBuffer(buffer);
+ read_stream_reset(stream);
+ EvictUnpinnedBuffer(buffer, &flushed);
+ }
+ avg = sum / lengthof(samples);
+ for (int i = 0; i < lengthof(samples); i++)
+ {
+ dev = samples[i] - avg;
+ var += dev * dev;
+ }
+ stddev = sqrt(var / lengthof(samples));
+
+ elog(NOTICE, "n = %zu, avg = %.1fus, stddev = %.1f", lengthof(samples), avg, stddev);
+ }
+ read_stream_end(stream);
+ relation_close(rel, AccessShareLock);
+
+ PG_RETURN_VOID();
+}
--
2.39.5