Re: [PATCH] Optimize ProcSignal to avoid redundant SIGUSR1 signals - Mailing list pgsql-hackers

From Joel Jacobson
Subject Re: [PATCH] Optimize ProcSignal to avoid redundant SIGUSR1 signals
Date
Msg-id 6ba1d3f8-df6c-4e2d-923e-4984647e97ca@app.fastmail.com
Whole thread Raw
In response to Re: [PATCH] Optimize ProcSignal to avoid redundant SIGUSR1 signals  (Thomas Munro <thomas.munro@gmail.com>)
List pgsql-hackers
On Tue, Jul 22, 2025, at 23:54, Thomas Munro wrote:
> On Wed, Jul 23, 2025 at 8:08 AM Joel Jacobson <joel@compiler.org> wrote:
>> Previously, ProcSignal used an array of volatile sig_atomic_t flags, one
>> per signal reason. A sender would set a flag and then unconditionally
>> send a SIGUSR1 to the target process. This could result in a storm of
>> redundant signals if multiple processes signaled the same target before
>> it had a chance to run its signal handler.
>
> It's a good idea with great results!
>
> FWIW the "new interrupts systems" patch set[1] also contains this
> idea.  But it goes further, because it also removes all the
> corresponding "pending" local variables: notice how
> HandleNotifyInterrupt() really just sets notifyInterruptPending = true
> and does SetLatch(MyLatch).  So instead of having
> CHECK_FOR_INTERRUPTS() check all those local variables, we can merge
> "procsignals" with "interrupts", and have CHECK_FOR_INTERRUPTS()
> itself read that atomic word directly, skipping the middleman and
> deleting the whole ProcSignal system.  Originally I proposed that the
> sending backend would now do SendInterrupt() directly, essentially
> moving the contents of the signal handler into the sender and setting
> the receiver's latch directly.  But then Heikki went further and
> proposed deleting latches too, and having "interrupts" as our only
> remaining inter-backend wakeup abstraction, with one of the interrupt
> flags used as a "general" one that replaces all the places that use
> SetLatch() directly today.
>
> The end state could include a WaitEventSetWait() implementation that
> waits for that single remaining atomic word with a (multiplexed) futex
> wait, also removing the "maybe sleeping" dance because futexes already
> have ideal protection against races.  Or you can send a byte to a pipe
> or post a custom event to an io_uring or kqueue or whatever.
>
> That's part of a larger project to get rid of all inter-backend
> signals, on the pathway to multi-threaded backends.  Some things along
> the way have included making it true that all real
> IPC-request-handling work is done in CHECK_FOR_INTERRUPTS(), not
> signal handlers (ie making it all "cooperative"), and making it safe
> to use uint32_t atomics at all in signal handlers as you're doing here
> (previously they were allowed to be emulated with spinlocks), as an
> intermediate step because in the short term we still have signals for
> timers.
>
> I'm planning to post a rebase of that work with some improvements
> soon.  Hmm, I wonder if there is any sense in restructuring it so that
> your patch becomes an incremental stepping stone.  I think one of our
> problems might have been trying to change too many things at once.
> What you're doing is certainly independently good, but I haven't
> studied your patch too closely yet.
>
> [1]
> https://www.postgresql.org/message-id/flat/CA%2BhUKG%2B3MkS21yK4jL4cgZywdnnGKiBg0jatoV6kzaniBmcqbQ%40mail.gmail.com

Great to hear you're also working in this area!

I like the idea of incremental stepping stones,
I can certainly help both reviewing and participating in that work.

To give you an idea of the size of my patch:

 src/backend/storage/ipc/procsignal.c | 103
++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------
 src/include/storage/procsignal.h     |   3 +++
 2 files changed, 57 insertions(+), 49 deletions(-)

When you rebase your patchset, I can try to see if there is a natural fit.

/Joel



pgsql-hackers by date:

Previous
From: David Rowley
Date:
Subject: Re: [PATCH] Use strchr() to search for a single character
Next
From: Masahiko Sawada
Date:
Subject: Re: Conflict detection for update_deleted in logical replication