aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Munro <tmunro@postgresql.org>2019-02-24 13:38:15 +1300
committerThomas Munro <tmunro@postgresql.org>2019-02-24 22:43:54 +1300
commit30dcb6270c915691fb82477f6b3c489977cae050 (patch)
treeee7cdf201e51db64a1cdd77696c9b58fafb16079 /src
parent07fba9ad9b71c87a63f87a0ff16b6165ff08fc5e (diff)
downloadpostgresql-30dcb6270c915691fb82477f6b3c489977cae050.tar.gz
postgresql-30dcb6270c915691fb82477f6b3c489977cae050.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')
-rw-r--r--src/backend/storage/file/fd.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c
index 79a147466bd..747eb3c537e 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")));
}