0001-read_stream-restore-prefetch-distance-after-reset.patch
text/x-patch
Filename: 0001-read_stream-restore-prefetch-distance-after-reset.patch
Type: text/x-patch
Part: 0
Message:
Re: index prefetching
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 0001
Subject: read_stream: restore prefetch distance after reset
| File | + | − |
|---|---|---|
| src/backend/storage/aio/read_stream.c | 12 | 2 |
From 817d5a7f7d19d0d9fe75ba1bb00a8164a438021a Mon Sep 17 00:00:00 2001
From: Tomas Vondra <tomas@vondra.me>
Date: Fri, 18 Jul 2025 16:41:03 +0200
Subject: [PATCH] read_stream: restore prefetch distance after reset
---
src/backend/storage/aio/read_stream.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/src/backend/storage/aio/read_stream.c b/src/backend/storage/aio/read_stream.c
index 0e7f5557f5c..796791f8427 100644
--- a/src/backend/storage/aio/read_stream.c
+++ b/src/backend/storage/aio/read_stream.c
@@ -99,6 +99,7 @@ struct ReadStream
int16 forwarded_buffers;
int16 pinned_buffers;
int16 distance;
+ int16 distance_old;
int16 initialized_buffers;
int read_buffers_flags;
bool sync_mode; /* using io_method=sync */
@@ -443,6 +444,7 @@ read_stream_look_ahead(ReadStream *stream)
if (blocknum == InvalidBlockNumber)
{
/* End of stream. */
+ stream->distance_old = stream->distance;
stream->distance = 0;
break;
}
@@ -841,6 +843,7 @@ read_stream_next_buffer(ReadStream *stream, void **per_buffer_data)
else
{
/* No more blocks, end of stream. */
+ stream->distance_old = stream->distance;
stream->distance = 0;
stream->oldest_buffer_index = stream->next_buffer_index;
stream->pinned_buffers = 0;
@@ -1012,6 +1015,9 @@ read_stream_reset(ReadStream *stream)
int16 index;
Buffer buffer;
+ /* remember the old distance (if we reset before end of the stream) */
+ stream->distance_old = Max(stream->distance, stream->distance_old);
+
/* Stop looking ahead. */
stream->distance = 0;
@@ -1044,8 +1050,12 @@ read_stream_reset(ReadStream *stream)
Assert(stream->pinned_buffers == 0);
Assert(stream->ios_in_progress == 0);
- /* Start off assuming data is cached. */
- stream->distance = 1;
+ /*
+ * Restore the old distance, if we have one. Otherwise start assuming
+ * data is cached.
+ */
+ stream->distance = Max(1, stream->distance_old);
+ stream->distance_old = 0;
}
/*
--
2.50.1