Remove O_FSYNC and associated macros.
authorThomas Munro <[email protected]>
Fri, 22 Jul 2022 00:30:37 +0000 (12:30 +1200)
committerThomas Munro <[email protected]>
Fri, 22 Jul 2022 00:41:17 +0000 (12:41 +1200)
O_FSYNC was a pre-POSIX way of spelling O_SYNC, supported since commit
9d645fd84c3 for non-conforming operating systems of the time.  It's not
needed on any modern system.  We can just use standard O_SYNC directly
if it exists (= all targeted systems except Windows), and get rid of our
OPEN_SYNC_FLAG macro.

Similarly for standard O_DSYNC, we can just use that directly if it
exists (= all targeted systems except DragonFlyBSD), and get rid of our
OPEN_DATASYNC_FLAG macro.

We still avoid choosing open_datasync as a default value for
wal_sync_method if O_DSYNC has the same value as O_SYNC (= only
OpenBSD), so there is no change in default behavior.

Discussion: https://postgr.es/m/CA%2BhUKGJE7y92NY7FG2ftUbZUaqohBU65_Ys_7xF5mUHo4wirTQ%40mail.gmail.com

src/backend/access/transam/xlog.c
src/bin/pg_test_fsync/pg_test_fsync.c
src/include/access/xlogdefs.h

index 9854b51c6af3207aab847885e12db01e8249d1c4..1da3b8eb2ea380317c744a43c5715673f5805780 100644 (file)
@@ -171,10 +171,10 @@ const struct config_enum_entry sync_method_options[] = {
 #ifdef HAVE_FDATASYNC
    {"fdatasync", SYNC_METHOD_FDATASYNC, false},
 #endif
-#ifdef OPEN_SYNC_FLAG
+#ifdef O_SYNC
    {"open_sync", SYNC_METHOD_OPEN, false},
 #endif
-#ifdef OPEN_DATASYNC_FLAG
+#ifdef O_DSYNC
    {"open_datasync", SYNC_METHOD_OPEN_DSYNC, false},
 #endif
    {NULL, 0, false}
@@ -7894,10 +7894,10 @@ get_sync_bit(int method)
 
    /*
     * Optimize writes by bypassing kernel cache with O_DIRECT when using
-    * O_SYNC/O_FSYNC and O_DSYNC.  But only if archiving and streaming are
-    * disabled, otherwise the archive command or walsender process will read
-    * the WAL soon after writing it, which is guaranteed to cause a physical
-    * read if we bypassed the kernel cache. We also skip the
+    * O_SYNC and O_DSYNC.  But only if archiving and streaming are disabled,
+    * otherwise the archive command or walsender process will read the WAL
+    * soon after writing it, which is guaranteed to cause a physical read if
+    * we bypassed the kernel cache. We also skip the
     * posix_fadvise(POSIX_FADV_DONTNEED) call in XLogFileClose() for the same
     * reason.
     *
@@ -7921,13 +7921,13 @@ get_sync_bit(int method)
        case SYNC_METHOD_FSYNC_WRITETHROUGH:
        case SYNC_METHOD_FDATASYNC:
            return 0;
-#ifdef OPEN_SYNC_FLAG
+#ifdef O_SYNC
        case SYNC_METHOD_OPEN:
-           return OPEN_SYNC_FLAG | o_direct_flag;
+           return O_SYNC | o_direct_flag;
 #endif
-#ifdef OPEN_DATASYNC_FLAG
+#ifdef O_DSYNC
        case SYNC_METHOD_OPEN_DSYNC:
-           return OPEN_DATASYNC_FLAG | o_direct_flag;
+           return O_DSYNC | o_direct_flag;
 #endif
        default:
            /* can't happen (unless we are out of sync with option array) */
index f7bc199a30af5b43e5d8b6fe9e212510e5378508..6739214eb83e9b8ecd635ea6a06cca998d92f4f1 100644 (file)
@@ -300,7 +300,7 @@ test_sync(int writes_per_op)
    printf(LABEL_FORMAT, "open_datasync");
    fflush(stdout);
 
-#ifdef OPEN_DATASYNC_FLAG
+#ifdef O_DSYNC
    if ((tmpfile = open_direct(filename, O_RDWR | O_DSYNC | PG_BINARY, 0)) == -1)
    {
        printf(NA_FORMAT, _("n/a*"));
@@ -407,8 +407,8 @@ test_sync(int writes_per_op)
    printf(LABEL_FORMAT, "open_sync");
    fflush(stdout);
 
-#ifdef OPEN_SYNC_FLAG
-   if ((tmpfile = open_direct(filename, O_RDWR | OPEN_SYNC_FLAG | PG_BINARY, 0)) == -1)
+#ifdef O_SYNC
+   if ((tmpfile = open_direct(filename, O_RDWR | O_SYNC | PG_BINARY, 0)) == -1)
    {
        printf(NA_FORMAT, _("n/a*"));
        fs_warning = true;
@@ -466,7 +466,7 @@ test_open_syncs(void)
 static void
 test_open_sync(const char *msg, int writes_size)
 {
-#ifdef OPEN_SYNC_FLAG
+#ifdef O_SYNC
    int         tmpfile,
                ops,
                writes;
@@ -475,8 +475,8 @@ test_open_sync(const char *msg, int writes_size)
    printf(LABEL_FORMAT, msg);
    fflush(stdout);
 
-#ifdef OPEN_SYNC_FLAG
-   if ((tmpfile = open_direct(filename, O_RDWR | OPEN_SYNC_FLAG | PG_BINARY, 0)) == -1)
+#ifdef O_SYNC
+   if ((tmpfile = open_direct(filename, O_RDWR | O_SYNC | PG_BINARY, 0)) == -1)
        printf(NA_FORMAT, _("n/a*"));
    else
    {
index a47e3eeb1f513178fad3581031cb2fbd4ff0c623..810cd1fd86aa2efa57b5e68dff7f596b2a100f0a 100644 (file)
@@ -69,28 +69,12 @@ typedef uint16 RepOriginId;
  * are available on the current platform, and to choose an appropriate
  * default method.  We assume that fsync() is always available, and that
  * configure determined whether fdatasync() is.
+ *
+ * Note that we define our own O_DSYNC on Windows, but not O_SYNC.
  */
-#if defined(O_SYNC)
-#define OPEN_SYNC_FLAG     O_SYNC
-#elif defined(O_FSYNC)
-#define OPEN_SYNC_FLAG     O_FSYNC
-#endif
-
-#if defined(O_DSYNC)
-#if defined(OPEN_SYNC_FLAG)
-/* O_DSYNC is distinct? */
-#if O_DSYNC != OPEN_SYNC_FLAG
-#define OPEN_DATASYNC_FLAG     O_DSYNC
-#endif
-#else                          /* !defined(OPEN_SYNC_FLAG) */
-/* Win32 only has O_DSYNC */
-#define OPEN_DATASYNC_FLAG     O_DSYNC
-#endif
-#endif
-
 #if defined(PLATFORM_DEFAULT_SYNC_METHOD)
 #define DEFAULT_SYNC_METHOD        PLATFORM_DEFAULT_SYNC_METHOD
-#elif defined(OPEN_DATASYNC_FLAG)
+#elif defined(O_DSYNC) && (!defined(O_SYNC) || O_DSYNC != O_SYNC)
 #define DEFAULT_SYNC_METHOD        SYNC_METHOD_OPEN_DSYNC
 #elif defined(HAVE_FDATASYNC)
 #define DEFAULT_SYNC_METHOD        SYNC_METHOD_FDATASYNC