From 7c85be08a2d404ec2a1a6a3b089e7f08d62e5db8 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Sat, 14 Dec 2019 17:38:09 +1300 Subject: [PATCH] Fix mdsyncfiletag(), take II. The previous commit failed to consider that FileGetRawDesc() might not return a valid fd, as discovered on the build farm. Switch to using the File interface only. Back-patch to 12, like the previous commit. --- src/backend/storage/smgr/md.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c index b110518a86..82442db046 100644 --- a/src/backend/storage/smgr/md.c +++ b/src/backend/storage/smgr/md.c @@ -1280,19 +1280,16 @@ int mdsyncfiletag(const FileTag *ftag, char *path) { SMgrRelation reln = smgropen(ftag->rnode, InvalidBackendId); - int fd, - result, - save_errno; + File file; bool need_to_close; + int result, + save_errno; /* See if we already have the file open, or need to open it. */ if (ftag->segno < reln->md_num_open_segs[ftag->forknum]) { - File file; - file = reln->md_seg_fds[ftag->forknum][ftag->segno].mdfd_vfd; strlcpy(path, FilePathName(file), MAXPGPATH); - fd = FileGetRawDesc(file); need_to_close = false; } else @@ -1303,24 +1300,20 @@ mdsyncfiletag(const FileTag *ftag, char *path) strlcpy(path, p, MAXPGPATH); pfree(p); - fd = OpenTransientFile(path, O_RDWR); - if (fd < 0) + file = PathNameOpenFile(path, O_RDWR | PG_BINARY); + if (file < 0) return -1; need_to_close = true; } /* Sync the file. */ - pgstat_report_wait_start(WAIT_EVENT_DATA_FILE_SYNC); - result = pg_fsync(fd); + result = FileSync(file, WAIT_EVENT_DATA_FILE_SYNC); save_errno = errno; - pgstat_report_wait_end(); - if (need_to_close && CloseTransientFile(fd) != 0) - ereport(WARNING, - (errcode_for_file_access(), - errmsg("could not close file \"%s\": %m", path))); + if (need_to_close) + FileClose(file); + errno = save_errno; - return result; }