• Andres Freund's avatar
    Block signals while computing the sleep time in postmaster's main loop. · a39e78b7
    Andres Freund authored
    DetermineSleepTime() was previously called without blocked
    signals. That's not good, because it allows signal handlers to
    interrupt its workings.
    
    DetermineSleepTime() was added in 9.3 with the addition of background
    workers (da07a1e8), where it only read from
    BackgroundWorkerList.
    
    Since 9.4, where dynamic background workers were added (7f7485a0),
    the list is also manipulated in DetermineSleepTime(). That's bad
    because the list now can be persistently corrupted if modified by both
    a signal handler and DetermineSleepTime().
    
    This was discovered during the investigation of hangs on buildfarm
    member anole. It's unclear whether this bug is the source of these
    hangs or not, but it's worth fixing either way. I have confirmed that
    it can cause crashes.
    
    It luckily looks like this only can cause problems when bgworkers are
    actively used.
    
    Discussion: 20140929193733.GB14400@awork2.anarazel.de
    
    Backpatch to 9.3 where background workers were introduced.
    a39e78b7
postmaster.c 165 KB