• Heikki Linnakangas's avatar
    Add OpenTransientFile, with automatic cleanup at end-of-xact. · 1f67078e
    Heikki Linnakangas authored
    Files opened with BasicOpenFile or PathNameOpenFile are not automatically
    cleaned up on error. That puts unnecessary burden on callers that only want
    to keep the file open for a short time. There is AllocateFile, but that
    returns a buffered FILE * stream, which in many cases is not the nicest API
    to work with. So add function called OpenTransientFile, which returns a
    unbuffered fd that's cleaned up like the FILE* returned by AllocateFile().
    
    This plugs a few rare fd leaks in error cases:
    
    1. copy_file() - fixed by by using OpenTransientFile instead of BasicOpenFile
    2. XLogFileInit() - fixed by adding close() calls to the error cases. Can't
       use OpenTransientFile here because the fd is supposed to persist over
       transaction boundaries.
    3. lo_import/lo_export - fixed by using OpenTransientFile instead of
       PathNameOpenFile.
    
    In addition to plugging those leaks, this replaces many BasicOpenFile() calls
    with OpenTransientFile() that were not leaking, because the code meticulously
    closed the file on error. That wasn't strictly necessary, but IMHO it's good
    for robustness.
    
    The same leaks exist in older versions, but given the rarity of the issues,
    I'm not backpatching this. Not yet, anyway - it might be good to backpatch
    later, after this mechanism has had some more testing in master branch.
    1f67078e
md.c 54.1 KB