• Thomas Munro's avatar
    Block signals while allocating DSM memory. · 2019e6ec
    Thomas Munro authored
    On Linux, we call posix_fallocate() on shm_open()'d memory to avoid
    later potential SIGBUS (see commit 899bd785).
    
    Based on field reports of systems stuck in an EINTR retry loop there,
    there, we made it possible to break out of that loop via slightly odd
    coding where the CHECK_FOR_INTERRUPTS() call was somewhat removed from
    the loop (see commit 422952ee).
    
    On further reflection, that was not a great choice for at least two
    reasons:
    
    1.  If interrupts were held, the CHECK_FOR_INTERRUPTS() would do nothing
    and the EINTR error would be surfaced to the user.
    
    2.  If EINTR was reported but neither QueryCancelPending nor
    ProcDiePending was set, then we'd dutifully retry, but with a bit more
    understanding of how posix_fallocate() works, it's now clear that you
    can get into a loop that never terminates.  posix_fallocate() is not a
    function that can do some of the job and tell you about progress if it's
    interrupted, it has to undo what it's done so far and report EINTR, and
    if signals keep arriving faster than it can complete (cf recovery
    conflict signals), you're stuck.
    
    Therefore, for now, we'll simply block most signals to guarantee
    progress.  SIGQUIT is not blocked (see InitPostmasterChild()), because
    its expected handler doesn't return, and unblockable signals like
    SIGCONT are not expected to arrive at a high rate.  For good measure,
    we'll include the ftruncate() call in the blocked region, and add a
    retry loop.
    
    Back-patch to all supported releases.
    Reported-by: default avatarAlvaro Herrera <alvherre@alvh.no-ip.org>
    Reported-by: default avatarNicola Contu <nicola.contu@gmail.com>
    Reviewed-by: default avatarAlvaro Herrera <alvherre@alvh.no-ip.org>
    Reviewed-by: default avatarAndres Freund <andres@anarazel.de>
    Discussion: https://postgr.es/m/20220701154105.jjfutmngoedgiad3%40alvherre.pgsql
    2019e6ec
dsm_impl.c 29.8 KB