• Tom Lane's avatar
    Run the postmaster's signal handlers without SA_RESTART. · 89390208
    Tom Lane authored
    The postmaster keeps signals blocked everywhere except while waiting
    for something to happen in ServerLoop().  The code expects that the
    select(2) will be cancelled with EINTR if an interrupt occurs; without
    that, followup actions that should be performed by ServerLoop() itself
    will be delayed.  However, some platforms interpret the SA_RESTART
    signal flag as meaning that they should restart rather than cancel
    the select(2).  Worse yet, some of them restart it with the original
    timeout delay, meaning that a steady stream of signal interrupts can
    prevent ServerLoop() from iterating at all if there are no incoming
    connection requests.
    
    Observable symptoms of this, on an affected platform such as HPUX 10,
    include extremely slow parallel query startup (possibly as much as
    30 seconds) and failure to update timestamps on the postmaster's sockets
    and lockfiles when no new connections arrive for a long time.
    
    We can fix this by running the postmaster's signal handlers without
    SA_RESTART.  That would be quite a scary change if the range of code
    where signals are accepted weren't so tiny, but as it is, it seems
    safe enough.  (Note that postmaster children do, and must, reset all
    the handlers before unblocking signals; so this change should not
    affect any child process.)
    
    There is talk of rewriting the postmaster to use a WaitEventSet and
    not do signal response work in signal handlers, at which point it might
    be appropriate to revert this patch.  But that's not happening before
    v11 at the earliest.
    
    Back-patch to 9.6.  The problem exists much further back, but the
    worst symptom arises only in connection with parallel query, so it
    does not seem worth taking any portability risks in older branches.
    
    Discussion: https://postgr.es/m/9205.1492833041@sss.pgh.pa.us
    89390208
postmaster.c 175 KB