Re: Optimize LISTEN/NOTIFY

From: Chao Li <li(dot)evan(dot)chao(at)gmail(dot)com>
To: Joel Jacobson <joel(at)compiler(dot)org>
Cc: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Thomas Munro <thomas(dot)munro(at)gmail(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>, Heikki Linnakangas <hlinnaka(at)iki(dot)fi>, Rishu Bagga <rishu(dot)postgres(at)gmail(dot)com>
Subject: Re: Optimize LISTEN/NOTIFY
Date: 2025-09-26 09:44:44
Message-ID: 9186C6D0-F7A9-482A-9183-89E530B57E36@gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

> On Sep 26, 2025, at 17:32, Joel Jacobson <joel(at)compiler(dot)org> wrote:
>
> On Fri, Sep 26, 2025, at 04:26, Chao Li wrote:
>
>> I think what you explained is partially correct.
>>
>> Based on my understanding, any backend process may call
>> SignalBackends(), which means that it’s possible that multiple backend
>> processes may call SignalBackends() concurrently.
>>
>> Looking at your code, between checking
>> QUEUE_BACKEND_WAKEUP_PENDING_FLAG(i) and set the flag to true, there is
>> a block of code (the “if-else”) to run, so that it’s possible that
>> multiple backend processes have passed the
>> QUEUE_BACKEND_WAKEUP_PENDING_FLAG(i) check, then multiple signals will
>> be sent to a process, which will lead to duplicate timeout enabled in
>> the receiver process.
>
> I don't see how that can happen; we're checking wakeup_pending_flag
> while holding an exclusive lock, so I don't see how multiple backend
> processes could be within the region where we check/set
> wakeup_pending_flag, at the same time?
>
> /Joel

I might miss the factor of holding an exclusive lock. I will revisit that part again.

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Chao Li 2025-09-26 09:51:13 Re: Mark function arguments of type "Datum *" as "const Datum *" where possible
Previous Message Ashutosh Bapat 2025-09-26 09:41:00 Re: POC: enable logical decoding when wal_level = 'replica' without a server restart