mirror of
https://github.com/postgres/postgres.git
synced 2025-04-29 13:56:47 +03:00
Improve copydir() code for the case that fsync is off.
We should avoid calling sync_file_range or posix_fadvise in this case, since (a) we don't really care if the data gets synced, and might as well save the kernel calls; (b) at least on Linux we know that the kernel might block us until it's scheduled the write. Also, avoid making a useless second traversal of the directory tree if we're not actually going to call fsync(2) after all.
This commit is contained in:
parent
2c4f5b4bc5
commit
2d46a57ddc
@ -98,7 +98,11 @@ copydir(char *fromdir, char *todir, bool recurse)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Be paranoid here and fsync all files to ensure the copy is really done.
|
* Be paranoid here and fsync all files to ensure the copy is really done.
|
||||||
|
* But if fsync is disabled, we're done.
|
||||||
*/
|
*/
|
||||||
|
if (!enableFsync)
|
||||||
|
return;
|
||||||
|
|
||||||
xldir = AllocateDir(todir);
|
xldir = AllocateDir(todir);
|
||||||
if (xldir == NULL)
|
if (xldir == NULL)
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
@ -200,9 +204,9 @@ copy_file(char *fromfile, char *tofile)
|
|||||||
/*
|
/*
|
||||||
* We fsync the files later but first flush them to avoid spamming the
|
* We fsync the files later but first flush them to avoid spamming the
|
||||||
* cache and hopefully get the kernel to start writing them out before
|
* cache and hopefully get the kernel to start writing them out before
|
||||||
* the fsync comes.
|
* the fsync comes. Ignore any error, since it's only a hint.
|
||||||
*/
|
*/
|
||||||
pg_flush_data(dstfd, offset, nbytes);
|
(void) pg_flush_data(dstfd, offset, nbytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (close(dstfd))
|
if (close(dstfd))
|
||||||
|
@ -337,19 +337,23 @@ pg_fdatasync(int fd)
|
|||||||
* pg_flush_data --- advise OS that the data described won't be needed soon
|
* pg_flush_data --- advise OS that the data described won't be needed soon
|
||||||
*
|
*
|
||||||
* Not all platforms have sync_file_range or posix_fadvise; treat as no-op
|
* Not all platforms have sync_file_range or posix_fadvise; treat as no-op
|
||||||
* if not available.
|
* if not available. Also, treat as no-op if enableFsync is off; this is
|
||||||
|
* because the call isn't free, and some platforms such as Linux will actually
|
||||||
|
* block the requestor until the write is scheduled.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
pg_flush_data(int fd, off_t offset, off_t amount)
|
pg_flush_data(int fd, off_t offset, off_t amount)
|
||||||
|
{
|
||||||
|
if (enableFsync)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_SYNC_FILE_RANGE)
|
#if defined(HAVE_SYNC_FILE_RANGE)
|
||||||
return sync_file_range(fd, offset, amount, SYNC_FILE_RANGE_WRITE);
|
return sync_file_range(fd, offset, amount, SYNC_FILE_RANGE_WRITE);
|
||||||
#elif defined(USE_POSIX_FADVISE) && defined(POSIX_FADV_DONTNEED)
|
#elif defined(USE_POSIX_FADVISE) && defined(POSIX_FADV_DONTNEED)
|
||||||
return posix_fadvise(fd, offset, amount, POSIX_FADV_DONTNEED);
|
return posix_fadvise(fd, offset, amount, POSIX_FADV_DONTNEED);
|
||||||
#else
|
|
||||||
return 0;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user