postgres.git / summary / log / commit / refs

commit    239b1753421ccbd52f4f628a9265c3034d38b80f
Author:   Thomas Munro <tmunro@postgresql.org>
Date:     Wed Jan 25 01:28:01 2023 +0000
First released in: 16.0

    Process pending postmaster work before connections.
    
    Modify the new event loop code from commit 7389aad6 so that it checks
    for work requested by signal handlers even if it doesn't see a latch
    event yet.
    
    This gives priority to shutdown and reload requests where the latch will
    be reported later in the event array, or in a later call to
    WaitEventSetWait(), due to scheduling details.  In particular, this
    guarantees that a SIGHUP-then-connect sequence (as seen in
    authentication tests) causes the postmaster to process the reload before
    accepting the connection.  If the WaitEventSetWait() call saw the socket
    as ready, and the reload signal was generated before the connection,
    then the latest time the signal handler should be able to run is after
    poll/epoll_wait/kevent returns but before we check the
    pending_pm_reload_request flag.
    
    While here, also shift the handling of child exit below reload requests,
    per Tom Lane's observation that that might start new processes, so we
    should make sure we pick up new settings first.
    
    This probably explains the one-off failure of build farm animal
    malleefowl.
    
    Reported-by: Hou Zhijie <houzj.fnst@fujitsu.com>
    Reported-by: Tom Lane <tgl@sss.pgh.pa.us>
    Discussion: https://postgr.es/m/OS0PR01MB57163D3BF2AB42ECAA94E5C394C29%40OS0PR01MB5716.jpnprd01.prod.outlook.com


src/backend/postmaster/postmaster.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 711efc35e33..5b775cf7d06 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -1750,20 +1750,25 @@ ServerLoop(void) for (int i = 0; i < nevents; i++) { if (events[i].events & WL_LATCH_SET) - { ResetLatch(MyLatch); - /* Process work requested via signal handlers. */ - if (pending_pm_shutdown_request) - process_pm_shutdown_request(); - if (pending_pm_child_exit) - process_pm_child_exit(); - if (pending_pm_reload_request) - process_pm_reload_request(); - if (pending_pm_pmsignal) - process_pm_pmsignal(); - } - else if (events[i].events & WL_SOCKET_ACCEPT) + /* + * The following requests are handled unconditionally, even if we + * didn't see WL_LATCH_SET. This gives high priority to shutdown + * and reload requests where the latch happens to appear later in + * events[] or will be reported by a later call to + * WaitEventSetWait(). + */ + if (pending_pm_shutdown_request) + process_pm_shutdown_request(); + if (pending_pm_reload_request) + process_pm_reload_request(); + if (pending_pm_child_exit) + process_pm_child_exit(); + if (pending_pm_pmsignal) + process_pm_pmsignal(); + + if (events[i].events & WL_SOCKET_ACCEPT) { Port *port; [parent: 8f8f11593258]