Re: Add pg_buffercache_evict_all() and pg_buffercache_mark_dirty[_all]() functions
Robert Haas <robertmhaas@gmail.com>
From: Robert Haas <robertmhaas@gmail.com>
To: Aidar Imamov <a.imamov@postgrespro.ru>
Cc: Nazir Bilal Yavuz <byavuz81@gmail.com>,
Andres Freund <andres@anarazel.de>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>, koshy44@gmail.com
Date: 2025-04-10T20:05:48Z
Lists: pgsql-hackers
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. :-(
--
Robert Haas
EDB: http://www.enterprisedb.com
Commits
-
pg_buffercache: Add pg_buffercache_mark_dirty{,_relation,_all}()
- 9ccc049dfe65 19 (unreleased) landed
-
doc: Add missing tags in pg_buffercache page
- c75bf57a90e0 19 (unreleased) landed
-
Add routines for marking buffers dirty efficiently
- 9660906dbd69 19 (unreleased) landed
-
Add pg_buffercache_evict_{relation,all} functions
- dcf7e1697ba7 18.0 landed