Default to wal_sync_method=fdatasync on FreeBSD.

FreeBSD 13 gained O_DSYNC, which would normally cause wal_sync_method to
choose open_datasync as its default value.  That may not be a good
choice for all systems, and performs worse than fdatasync in some
scenarios.  Let's preserve the existing default behavior for now.

Like commit 576477e73c, which did the same for Linux, back-patch to all
supported releases.

Discussion: https://postgr.es/m/CA%2BhUKGLsAMXBQrCxCXoW-JsUYmdOL8ALYvaX%3DCrHqWxm-nWbGA%40mail.gmail.com
This commit is contained in:
Thomas Munro 2021-02-15 15:43:39 +13:00
parent 2c8b42b50d
commit f900a79ecd
3 changed files with 11 additions and 2 deletions

View File

@ -2928,7 +2928,7 @@ include_dir 'conf.d'
Not all of these choices are available on all platforms.
The default is the first method in the above list that is supported
by the platform, except that <literal>fdatasync</literal> is the default on
Linux. The default is not necessarily ideal; it might be
Linux and FreeBSD. The default is not necessarily ideal; it might be
necessary to change this setting or other aspects of your system
configuration in order to create a crash-safe configuration or
achieve optimal performance.

View File

@ -206,7 +206,7 @@
#wal_sync_method = fsync # the default is the first option
# supported by the operating system:
# open_datasync
# fdatasync (default on Linux)
# fdatasync (default on Linux and FreeBSD)
# fsync
# fsync_writethrough
# open_sync

View File

@ -1 +1,10 @@
/* src/include/port/freebsd.h */
/*
* Set the default wal_sync_method to fdatasync. xlogdefs.h's normal rules
* would prefer open_datasync on FreeBSD 13+, but that is not a good choice on
* many systems.
*/
#ifdef HAVE_FDATASYNC
#define PLATFORM_DEFAULT_SYNC_METHOD SYNC_METHOD_FDATASYNC
#endif