Hi,
Thank you for looking into this!
On Thu, 10 Apr 2025 at 23:06, Robert Haas <robertmhaas@gmail.com> wrote:
>
> On Tue, Mar 18, 2025 at 6:03 PM Aidar Imamov <a.imamov@postgrespro.ru> wrote:
> > > for (int buf = 1; buf < NBuffers; buf++)
> > Mb it would be more correct to use <= NBuffers?
>
> I agree that (int buf = 1; buf < NBuffers; buf++) isn't right because
> that iterates one fewer times than the number of buffers. What was
> ultimately committed was:
>
> + for (int buf = 1; buf <= NBuffers; buf++)
> + {
> + BufferDesc *desc = GetBufferDescriptor(buf - 1);
>
> Curiously, there is no other instance of <= NBuffers in the code.
> Elsewhere we instead do:
>
> for (i = 0; i < NBuffers; i++)
> {
> BufferDesc *bufHdr = GetBufferDescriptor(i);
>
> Or in BufferSync:
>
> for (buf_id = 0; buf_id < NBuffers; buf_id++)
> {
> BufferDesc *bufHdr = GetBufferDescriptor(buf_id);
>
> Nonetheless what was committed seems pretty defensible, because we
> have lots of other places that do GetBufferDescriptor(buffer - 1) and
> similar. Alternating between 0-based indexing and 1-based indexing
> like this seems rather error-prone somehow. :-(
I understand your point. I did it like that because bufferids start
from 1 and go to NBuffers inclusive in the pg_buffercache view, so it
seems more natural to me to implement it like that. I am okay to
replace these loops with [1] to make it standart everywhere:
[1]
for (int buf = 0; buf < NBuffers; buf++)
{
BufferDesc *desc = GetBufferDescriptor(buf);
--
Regards,
Nazir Bilal Yavuz
Microsoft