Here's a starter patch that shows one of the approaches discussed. It
gets WSL users to a better place than they were before, by suppressing
further warnings after the first one.
This wasn't quite right, updated to check erro for ENOSYS (not rc)
This compiles and stops the panic on WSL (with a single warning).
I haven't tested if a version compiled on Linux will behave the same way - but based on the error messages in the top post it looks like the behavior is the same.
--
James
The contents of this email are confidential and may be subject to legal or professional privilege and copyright. No representation is made that this email is free of viruses or other defects. If you have received this communication in error, you may not copy or distribute any part of it or otherwise disclose its contents to anyone. Please advise the sender of your incorrect receipt of this correspondence.
From 9580cab0728a509e79be9d639937e0537f5d4cf6 Mon Sep 17 00:00:00 2001 From: Thomas Munro <thomas.munro@enterprisedb.com> Date: Tue, 19 Feb 2019 10:47:14 +1300 Subject: [PATCH] Tolerate ENOSYS failure from sync_file_range(). One unintended consequence of commit 9ccdd7f6 was that Windows WSL users now get a PANIC whenever PostgreSQL attempt to start flushing data with sync_file_range(), because Windows does not implement that system call. Previously, it generated a stream of periodic warnings. Prevent that by handling ENOSYS specially to avoid promotion to PANIC, and suppress all attempts after the first. Updated to correct the ENOSYS test to use errno rather than rc Reported-by: Bruce Klein Discussion: CA+mCpegfOUph2U4ZADtQT16dfbkjjYNJL1bSTWErsazaFjQW9A@mail.gmail.com">https://postgr.es/m/CA+mCpegfOUph2U4ZADtQT16dfbkjjYNJL1bSTWErsazaFjQW9A@mail.gmail.com --- src/backend/storage/file/fd.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c index 213de76..7544bd5 100644 --- a/src/backend/storage/file/fd.c +++ b/src/backend/storage/file/fd.c @@ -420,6 +420,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, @@ -434,7 +438,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"))); } -- 1.9.1