• Tom Lane's avatar
    Improve control logic for bgwriter hibernation mode. · 6308ba05
    Tom Lane authored
    Commit 6d90eaaa added a hibernation mode
    to the bgwriter to reduce the server's idle-power consumption.  However,
    its interaction with the detailed behavior of BgBufferSync's feedback
    control loop wasn't very well thought out.  That control loop depends
    primarily on the rate of buffer allocation, not the rate of buffer
    dirtying, so the hibernation mode has to be designed to operate only when
    no new buffer allocations are happening.  Also, the check for whether the
    system is effectively idle was not quite right and would fail to detect
    a constant low level of activity, thus allowing the bgwriter to go into
    hibernation mode in a way that would let the cycle time vary quite a bit,
    possibly further confusing the feedback loop.  To fix, move the wakeup
    support from MarkBufferDirty and SetBufferCommitInfoNeedsSave into
    StrategyGetBuffer, and prevent the bgwriter from entering hibernation mode
    unless no buffer allocations have happened recently.
    
    In addition, fix the delaying logic to remove the problem of possibly not
    responding to signals promptly, which was basically caused by trying to use
    the process latch's is_set flag for multiple purposes.  I can't prove it
    but I'm suspicious that that hack was responsible for the intermittent
    "postmaster does not shut down" failures we've been seeing in the buildfarm
    lately.  In any case it did nothing to improve the readability or
    robustness of the code.
    
    In passing, express the hibernation sleep time as a multiplier on
    BgWriterDelay, not a constant.  I'm not sure whether there's any value in
    exposing the longer sleep time as an independently configurable setting,
    but we can at least make it act like this for little extra code.
    6308ba05
buf_internals.h 7.71 KB