From: | Andres Freund <andres(at)anarazel(dot)de> |
---|---|
To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Cc: | Thomas Munro <thomas(dot)munro(at)gmail(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: Is RecoveryConflictInterrupt() entirely safe in a signal handler? |
Date: | 2022-04-09 23:00:13 |
Message-ID: | 20220409230013.yt7siryxxo4yujhy@alap3.anarazel.de |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Hi,
On 2022-04-09 14:39:16 -0700, Andres Freund wrote:
> On 2022-04-09 17:00:41 -0400, Tom Lane wrote:
> > Thomas Munro <thomas(dot)munro(at)gmail(dot)com> writes:
> > > Unlike most "procsignal" handler routines, RecoveryConflictInterrupt()
> > > doesn't just set a sig_atomic_t flag and poke the latch. Is the extra
> > > stuff it does safe? For example, is this call stack OK (to pick one
> > > that jumps out, but not the only one)?
> >
> > > procsignal_sigusr1_handler
> > > -> RecoveryConflictInterrupt
> > > -> HoldingBufferPinThatDelaysRecovery
> > > -> GetPrivateRefCount
> > > -> GetPrivateRefCountEntry
> > > -> hash_search(...hash table that might be in the middle of an update...)
> >
> > Ugh. That one was safe before somebody decided we needed a hash table
> > for buffer refcounts, but it's surely not safe now.
>
> Mea culpa. This is 4b4b680c3d6d - from 2014.
Whoa. There's way worse: StandbyTimeoutHandler() calls
SendRecoveryConflictWithBufferPin(), which calls CancelDBBackends(), which
acquires lwlocks etc.
Which very plausibly is the cause for the issue I'm investigating in
https://www.postgresql.org/message-id/20220409220054.fqn5arvbeesmxdg5%40alap3.anarazel.de
Greetings,
Andres Freund
From | Date | Subject | |
---|---|---|---|
Next Message | Andres Freund | 2022-04-09 23:10:02 | Re: failures in t/031_recovery_conflict.pl on CI |
Previous Message | Jonathan S. Katz | 2022-04-09 22:50:21 | Re: Commitfest wrapup |