From: Michael Paquier Date: Wed, 9 Oct 2019 04:30:43 +0000 (+0900) Subject: Flush logical mapping files with fd opened for read/write at checkpoint X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b8e19b932a99a7eb5a3bce84e74b0b7c093d0981;p=postgresql Flush logical mapping files with fd opened for read/write at checkpoint The file descriptor was opened with read-only to fsync a regular file, which would cause EBADFD errors on some platforms. This is similar to the recent fix done by a586cc4b (which was broken by me with 82a5649), except that I noticed this issue while monitoring the backend code for similar mistakes. Backpatch to 9.4, as this has been introduced since logical decoding exists as of b89e151. Author: Michael Paquier Reviewed-by: Andres Freund Discussion: https://postgr.es/m/20191006045548.GA14532@paquier.xyz Backpatch-through: 9.4 --- diff --git a/src/backend/access/heap/rewriteheap.c b/src/backend/access/heap/rewriteheap.c index 7c98a42b8b..306e74ea10 100644 --- a/src/backend/access/heap/rewriteheap.c +++ b/src/backend/access/heap/rewriteheap.c @@ -1280,7 +1280,8 @@ CheckPointLogicalRewriteHeap(void) } else { - int fd = OpenTransientFile(path, O_RDONLY | PG_BINARY); + /* on some operating systems fsyncing a file requires O_RDWR */ + int fd = OpenTransientFile(path, O_RDWR | PG_BINARY); /* * The file cannot vanish due to concurrency since this function