• Tom Lane's avatar
    Clean up error handling in pg_basebackup's walmethods.c. · 53c4a580
    Tom Lane authored
    The error handling here was a mess, as a result of a fundamentally
    bad design (relying on errno to keep its value much longer than is
    safe to assume) as well as a lot of just plain sloppiness, both as
    to noticing errors at all and as to reporting the correct errno.
    Moreover, the recent addition of LZ4 compression broke things
    completely, because liblz4 doesn't use errno to report errors.
    
    To improve matters, keep the error state in the DirectoryMethodData or
    TarMethodData struct, and add a string field so we can handle cases
    that don't set errno.  (The tar methods already had a version of this,
    but it can be done more efficiently since all these cases use a
    constant error string.)  Make the dir and tar methods handle errors
    in basically identical ways, which they didn't before.
    
    This requires copying errno into the state struct in a lot of places,
    which is a bit tedious, but it has the virtue that we can get rid of
    ad-hoc code to save and restore errno in a number of places ... not
    to mention that it fixes other places that should've saved/restored
    errno but neglected to.
    
    In passing, fix some pointlessly static buffers to be ordinary
    local variables.
    
    There remains an issue about exactly how to handle errors from
    fsync(), but that seems like material for its own patch.
    
    While the LZ4 problems are new, all the rest of this is fixes for
    old bugs, so backpatch to v10 where walmethods.c was introduced.
    
    Patch by me; thanks to Michael Paquier for review.
    
    Discussion: https://postgr.es/m/1343113.1636489231@sss.pgh.pa.us
    53c4a580
walmethods.c 24.7 KB