diff options
author | Thomas Munro <tmunro@postgresql.org> | 2019-02-24 13:38:15 +1300 |
---|---|---|
committer | Thomas Munro <tmunro@postgresql.org> | 2019-02-24 22:44:18 +1300 |
commit | 387483e89b2851247e091013bfdbfd1c448cb7df (patch) | |
tree | 8ab8c74876af6f6154d1cb362de3dd50a8c5cdbf /src/backend/storage/file/fd.c | |
parent | 58947fbd56d1481a86a03087c81f728fdf0be866 (diff) | |
download | postgresql-387483e89b2851247e091013bfdbfd1c448cb7df.tar.gz postgresql-387483e89b2851247e091013bfdbfd1c448cb7df.zip |
Tolerate ENOSYS failure from sync_file_range().
One unintended consequence of commit 9ccdd7f6 was that Windows WSL
users started getting a panic whenever we tried to initiate data
flushing with sync_file_range(), because WSL does not implement that
system call. Previously, they got a stream of periodic warnings,
which was also undesirable but at least ignorable.
Prevent the panic by handling ENOSYS specially and skipping the panic
promotion with data_sync_elevel(). Also suppress future attempts
after the first such failure so that the pre-existing problem of
noisy warnings is improved.
Back-patch to 9.6 (older branches were not affected in this way by
9ccdd7f6).
Author: Thomas Munro and James Sewell
Tested-by: James Sewell
Reported-by: Bruce Klein
Discussion: https://postgr.es/m/CA+mCpegfOUph2U4ZADtQT16dfbkjjYNJL1bSTWErsazaFjQW9A@mail.gmail.com
Diffstat (limited to 'src/backend/storage/file/fd.c')
-rw-r--r-- | src/backend/storage/file/fd.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c index 1e83d171157..96fe1827b20 100644 --- a/src/backend/storage/file/fd.c +++ b/src/backend/storage/file/fd.c @@ -423,6 +423,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, @@ -437,7 +441,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"))); } |