postgres.git / summary / log / commit / refs

commit    07d47231fbc57ac8e84ac1bd5cdf2e7e1966a45f
Author:   Alvaro Herrera <alvherre@alvh.no-ip.org>
Date:     Fri Aug 19 17:38:55 2016 +0000

    reorderbuffer: preserve errno while reporting error
    
    Clobbering errno during cleanup after an error is an oft-repeated, easy
    to make mistake.  Deal with it here as everywhere else, by saving it
    aside and restoring after cleanup, before ereport'ing.
    
    In passing, add a missing errcode declaration in another ereport() call
    in the same file, which I noticed while skimming the file looking for
    similar problems.
    
    Backpatch to 9.4, where this code was introduced.


src/backend/replication/logical/reorderbuffer.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index 30aa5706d88..3b63e21dbd0 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -2136,7 +2136,10 @@ ReorderBufferSerializeChange(ReorderBuffer *rb, ReorderBufferTXN *txn, if (write(fd, rb->outbuf, ondisk->size) != ondisk->size) { + int save_errno = errno; + CloseTransientFile(fd); + errno = save_errno; ereport(ERROR, (errcode_for_file_access(), errmsg("could not write to data file for XID %u: %m", @@ -2865,7 +2868,8 @@ ApplyLogicalMappingFile(HTAB *tuplecid_data, Oid relid, const char *fname) fd = OpenTransientFile(path, O_RDONLY | PG_BINARY, 0); if (fd < 0) ereport(ERROR, - (errmsg("could not open file \"%s\": %m", path))); + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", path))); while (true) { [parent: 1d990cd8c41c]