From adefba37841d4d788c34b53464afc2c7ed83ead5 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Tue, 3 Mar 2026 16:25:41 -0500 Subject: [PATCH v14 09/16] WIP: read_stream: Issue IO synchronously while in fast path While in fast-path, execute any IO that we might encounter synchronously. Because we are, right now, not reading ahead, dispatching any occasional IO to workers would have the overhead of dispatching to workers, without any realistic chance of the IO completing before we need it. Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- src/backend/storage/aio/read_stream.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/backend/storage/aio/read_stream.c b/src/backend/storage/aio/read_stream.c index cd54c1a74..3667d67ab 100644 --- a/src/backend/storage/aio/read_stream.c +++ b/src/backend/storage/aio/read_stream.c @@ -833,6 +833,19 @@ read_stream_next_buffer(ReadStream *stream, void **per_buffer_data) if (stream->advice_enabled) flags |= READ_BUFFERS_ISSUE_ADVICE; + /* + * While in fast-path, execute any IO that we might encounter + * synchronously. Because we are, right now, not reading ahead, + * dispatching any occasional IO to workers would have the + * overhead of dispatching to workers, without any realistic + * chance of the IO completing before we need it. We will switch + * to non-synchronous IO after this. + * + * XXX: Should we do so only for worker, or also io_uring? There's + * not much dispatch overhead with io_uring, compared to worker... + */ + flags |= READ_BUFFERS_SYNCHRONOUSLY; + /* * Pin a buffer for the next call. Same buffer entry, and * arbitrary I/O entry (they're all free). We don't have to @@ -860,6 +873,8 @@ read_stream_next_buffer(ReadStream *stream, void **per_buffer_data) stream->ios_in_progress = 1; stream->ios[0].buffer_index = oldest_buffer_index; stream->seq_blocknum = next_blocknum + 1; + + /* FIXME: it would probably worth issuing readahead here */ } else { -- 2.53.0