• Andres Freund's avatar
    Fix XLogReader FD leak that makes backends unusable after 2PC usage. · 91c40548
    Andres Freund authored
    Before the fix every 2PC commit/abort leaked a file descriptor. As the
    files are opened using BasicOpenFile(), that quickly leads to the
    backend running out of file descriptors.
    
    Once enough 2PC abort/commit have caused enough FDs to leak, any IO
    in the backend will fail with "Too many open files", as
    BasicOpenFilePerm() will have triggered all open files known to fd.c
    to be closed.
    
    The leak causing the problem at hand is a consequence of 0dc8ead4,
    but is only exascerbated by it. Previously most XLogPageReadCB
    callbacks used static variables to cache one open file, but after the
    commit the cache is private to each XLogReader instance. There never
    was infrastructure to close FDs at the time of XLogReaderFree, but the
    way XLogReader was used limited the leak to one FD.
    
    This commit just closes the during XLogReaderFree() if the FD is
    stored in XLogReaderState.seg.ws_segno. This may not be the way to
    solve this medium/long term, but at least unbreaks 2PC.
    
    Discussion: https://postgr.es/m/20200406025651.fpzdb5yyb7qyhqko@alap3.anarazel.de
    91c40548
xlogreader.c 43.5 KB