Support buffer forwarding in read_stream.c.
authorThomas Munro <[email protected]>
Fri, 21 Mar 2025 04:34:22 +0000 (17:34 +1300)
committerThomas Munro <[email protected]>
Fri, 21 Mar 2025 05:44:47 +0000 (18:44 +1300)
commited0b87caaca1eb3daa0f76f32499da7628286919
treed7025d56e6bc8b8ed8c9f66422ab3d7f2b5e3b62
parent14413d0ef5df4df4cad36cfe657e3f9d1f94bc2f
Support buffer forwarding in read_stream.c.

In preparation for a follow-up change to the buffer manager, teach
read_stream.c to manage buffers "forwarded" from one StartReadBuffers()
call to the next after a short read.  This involves a small amount of
extra book-keeping, and opens the way for lower levels to split I/O
operations without having to drop pins, as required for efficient
handling of various edge cases.

Concretely, the "buffers" argument will change from an out parameter to
an in/out parameter.  Buffer queue elements must be initialized on first
use and cleared after they're consumed, but forwarded buffers are left
where they fall ahead of the current pending read in the queue, ready
for use by the operation that continues where a short read left off.
The stream also needs to count them for pin limit management and release
them on reset/early end.

Tested-by: Andres Freund <[email protected]> (earlier versions)
Discussion: https://postgr.es/m/CA%2BhUKGK_%3D4CVmMHvsHjOVrK6t4F%3DLBpFzsrr3R%2BaJYN8kcTfWg%40mail.gmail.com
src/backend/storage/aio/read_stream.c