| From: | Andres Freund <andres(at)anarazel(dot)de> |
|---|---|
| To: | Yura Sokolov <y(dot)sokolov(at)postgrespro(dot)ru> |
| Cc: | Melanie Plageman <melanieplageman(at)gmail(dot)com>, Noah Misch <noah(at)leadboat(dot)com>, Heikki Linnakangas <hlinnaka(at)iki(dot)fi>, Kirill Reshke <reshkekirill(at)gmail(dot)com>, Matthias van de Meent <boekewurm+postgres(at)gmail(dot)com>, pgsql-hackers(at)postgresql(dot)org, Thomas Munro <thomas(dot)munro(at)gmail(dot)com>, Robert Haas <robertmhaas(at)gmail(dot)com>, Michael Paquier <michael(dot)paquier(at)gmail(dot)com> |
| Subject: | Re: Buffer locking is special (hints, checksums, AIO writes) |
| Date: | 2026-04-01 00:29:02 |
| Message-ID: | howw4lqoced6g3ybl2irnmlkaqcuq5s6cce7n45yp6ljbuczy3@f33c3jd7udlj |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
Hi,
On 2026-03-31 18:05:46 -0400, Andres Freund wrote:
> On 2026-03-31 19:02:33 +0300, Yura Sokolov wrote:
> > 27.03.2026 23:00, Andres Freund wrote:
> > > On 2026-03-25 18:35:55 -0400, Andres Freund wrote:
> > >> Running it through valgrind and then will work on reading through one more
> > >> time and pushing them.
> > >
> > > And done.
> > >
> > > Phew, this project took way longer than I'd though it'd take.
> >
> > In addition to bug with BM_IO_ERROR [1] , I found race condition in
> > PinBuffer in this lines of code:
> >
> > if (unlikely(skip_if_not_valid && !(old_buf_state & BM_VALID)))
> > return false;
> >
> > /*
> > * We're not allowed to increase the refcount while the buffer
> > * header spinlock is held. Wait for the lock to be released.
> > */
> > if (old_buf_state & BM_LOCKED)
> > old_buf_state = WaitBufHdrUnlocked(buf);
> >
> > While we waited for buffer header for being unlocked, it may become
> > invalid, isn't it?
> > Therefore, check related to skip_if_not_valid have to happen after waiting.
>
> Yea, that does seem wrong. Not sure how it ended up that way.
>
> I think it may be better to add a continue after the WaitBufHdrUnlocked(), so
> that we restart the loop, rather than moving the skip_if_not_valid check.
Done that way. Thanks for finding & reporting this, well spotted!
Greetings,
Andres
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Peter Smith | 2026-04-01 00:42:55 | Re: Skipping schema changes in publication |
| Previous Message | Amit Langote | 2026-04-01 00:06:49 | Re: Eliminating SPI / SQL from some RI triggers - take 3 |