mirror of
https://github.com/postgres/postgres.git
synced 2025-05-08 07:21:33 +03:00
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.
This commit is contained in:
parent
7bb3102cea
commit
7c85be08a2
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user