From: | Matheus Alcantara <matheusssilv97(at)gmail(dot)com> |
---|---|
To: | Nazir Bilal Yavuz <byavuz81(at)gmail(dot)com>, Kirill Reshke <reshkekirill(at)gmail(dot)com> |
Cc: | PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org> |
Subject: | Re: Use streaming read API in pgstattuple. |
Date: | 2024-11-29 17:05:24 |
Message-ID: | f05d896e-148e-46e2-a475-e0fb4c094614@gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
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
From | Date | Subject | |
---|---|---|---|
Next Message | David Benjamin | 2024-11-29 17:21:33 | Re: [PATCH] Avoid mixing custom and OpenSSL BIO functions |
Previous Message | Dmitry Dolgov | 2024-11-29 16:47:27 | Re: Changing shared_buffers without restart |