diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c index 79a147466b..747eb3c537 100644 --- a/src/backend/storage/file/fd.c +++ b/src/backend/storage/file/fd.c @@ -432,6 +432,10 @@ pg_flush_data(int fd, off_t offset, off_t nbytes) #if defined(HAVE_SYNC_FILE_RANGE) { int rc; + static bool not_implemented_by_kernel = false; + + if (not_implemented_by_kernel) + return; /* * sync_file_range(SYNC_FILE_RANGE_WRITE), currently linux specific, @@ -446,7 +450,22 @@ pg_flush_data(int fd, off_t offset, off_t nbytes) SYNC_FILE_RANGE_WRITE); if (rc != 0) { - ereport(data_sync_elevel(WARNING), + int elevel; + + /* + * For systems that don't have an implementation of + * sync_file_range() such as Windows WSL, generate only one + * warning and then suppress all further attempts by this process. + */ + if (errno == ENOSYS) + { + elevel = WARNING; + not_implemented_by_kernel = true; + } + else + elevel = data_sync_elevel(WARNING); + + ereport(elevel, (errcode_for_file_access(), errmsg("could not flush dirty data: %m"))); }