Re: EvictUnpinnedBuffer and buffer free list

From: Ashutosh Bapat <ashutosh(dot)bapat(dot)oss(at)gmail(dot)com>
To: Yura Sokolov <y(dot)sokolov(at)postgrespro(dot)ru>
Cc: pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: EvictUnpinnedBuffer and buffer free list
Date: 2025-01-31 11:36:54
Message-ID: CAExHW5uhXT0Hjm75cGMVWbzPrWBFFkm_aV+BJB7NemygtaFytw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Fri, Jan 31, 2025 at 2:19 PM Yura Sokolov <y(dot)sokolov(at)postgrespro(dot)ru> wrote:
>
> 31.01.2025 08:15, Ashutosh Bapat пишет:
> > Hi All,
> > EvictUnpinnedBuffer() calls InvalidateVictimBuffer() followed by
> > UnpinBuffer() before returning. None of those functions put the buffer
> > back into the free list. Its freeNext remains set to
> > FREENEXT_NOT_IN_LIST. I think then that buffer will never be used and
> > lost forever. I know that that function is only meant for development
> > or testing but even while testing something losing a buffer forever
> > seems like a problem.
> >
> > The prologue of function InvalidateVictimBuffer() says "/* Helper
> > routine for GetVictimBuffer() ". I believe that it's expected that the
> > buffer will be allocated to some other page, and that's why it doesn't
> > return the buffer to the free list. But in the case of
> > EvictUnpinnedBuffer() we are not using that buffer for any page, so it
> > must be returned to the free list. InvalidateBuffer() does that but
> > its prologue mentions that it's supposed to be used when freeing
> > buffers for relations and databases.
> >
> > I think there are two solutions
> > 1. Use InvalidBuffer() instead of InvalidateVictimBuffer(). But I am
> > not sure whether that's safe or what other safety measures we have to
> > put in EvictUnpinnedBuffer()
> > 2. Call StrategyFreeBuffer() after InvalidateVictimBuffer()
> >
> > Thoughts?
>
> Clock eviction algorithm visit every page (by StrategyGetBuffer), so it
> will eventually observe this buffer and use it for new page.
>

yes, that's correct. That does reduce the intensity of problem very
much. However, a backend which would otherwise be able to get a buffer
from freelist will be forced to evict some other useful buffer. This
may show unexpected results even in testing/development experiments
being carried out.

--
Best Wishes,
Ashutosh Bapat

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Ashutosh Bapat 2025-01-31 11:41:31 Re: jsonlog missing from logging_collector description
Previous Message Sergey Tatarintsev 2025-01-31 11:32:17 pgbench with partitioned tables