diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2016-08-19 14:38:55 -0300 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2016-08-19 14:38:55 -0300 |
commit | ac3aac3292d6e958bb8235120ba6a12159a29afe (patch) | |
tree | 3b69850d4d9cb3c721fffc92117770b78f10da79 /src/backend | |
parent | c4f1540d3a296d0328e21b32cdc612f611353b7c (diff) | |
download | postgresql-ac3aac3292d6e958bb8235120ba6a12159a29afe.tar.gz postgresql-ac3aac3292d6e958bb8235120ba6a12159a29afe.zip |
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.
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/replication/logical/reorderbuffer.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index 29bbae601c0..74b33c5ec4b 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -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) { |