]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
reorderbuffer: preserve errno while reporting error
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 19 Aug 2016 17:38:55 +0000 (14:38 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 19 Aug 2016 17:38:55 +0000 (14:38 -0300)
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

index 29bbae601c06fecd7838c1db120161ae697e031a..74b33c5ec4b57fae97d2e15ab64c83b4a3e0b33b 100644 (file)
@@ -2207,7 +2207,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",
@@ -2936,7 +2939,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)
        {