Hi,
On 29/11/24 04:28, Nazir Bilal Yavuz wrote:
> - for (; blkno < nblocks; blkno++)
> + p.last_exclusive = nblocks;
> +
> + while (BufferIsValid(buf = read_stream_next_buffer(stream, NULL)))
> {
> CHECK_FOR_INTERRUPTS();
>
> - pagefn(&stat, rel, blkno, bstrategy);
> + pagefn(&stat, rel, buf);
> }
> +
> + Assert(read_stream_next_buffer(stream, NULL) == InvalidBuffer);
>
> With this change we assume that if stream returns an invalid buffer
> that means stream must be finished. We don't check if the stream
> didn't finish but somehow read an invalid buffer. In the upstream
> version, if we read an invalid buffer then postgres server will fail.
> But in the patched version, the server will continue to run because it
> will think that stream has reached to end. This could be happening for
> other streaming read users; for example at least the
> read_stream_next_buffer() calls in the collect_corrupt_items()
> function face the same issue.
Just for reference; On pg_prewarm() for example this loop is
implemented as:
for (block = first_block; block <= last_block; ++block)
{
Buffer buf;
...
buf = read_stream_next_buffer(stream, NULL);
...
}
Assert(read_stream_next_buffer(stream, NULL) == InvalidBuffer);
Would this approach make sense on these cases? (this patch and on
collect_corrupt_items)
--
Matheus Alcantara