mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +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:
@ -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.
|
||||
* But if fsync is disabled, we're done.
|
||||
*/
|
||||
if (!enableFsync)
|
||||
return;
|
||||
|
||||
xldir = AllocateDir(todir);
|
||||
if (xldir == NULL)
|
||||
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
|
||||
* 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))
|
||||
|
Reference in New Issue
Block a user