0001-Fix-treatment-of-direct-I-O-in-pg_test_fsync.patch
text/x-patch
Filename: 0001-Fix-treatment-of-direct-I-O-in-pg_test_fsync.patch
Type: text/x-patch
Part: 0
Message:
Windows now has fdatasync()
Patch
Format: format-patch
Series: patch 0001
Subject: Fix treatment of direct I/O in pg_test_fsync.
| File | + | − |
|---|---|---|
| src/bin/pg_test_fsync/pg_test_fsync.c | 79 | 8 |
From 914b4da18d8249b4c1cb1219bcffd17625b0e2f1 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@gmail.com>
Date: Sun, 12 Dec 2021 14:13:35 +1300
Subject: [PATCH 1/4] Fix treatment of direct I/O in pg_test_fsync.
pg_test_fsync traditionally enabled O_DIRECT for the open_datasync and
open_sync tests. In fact current releases of PostgreSQL only do that if
wal_level=minimal (less commonly used). So, run the test both ways.
---
src/bin/pg_test_fsync/pg_test_fsync.c | 87 ++++++++++++++++++++++++---
1 file changed, 79 insertions(+), 8 deletions(-)
diff --git a/src/bin/pg_test_fsync/pg_test_fsync.c b/src/bin/pg_test_fsync/pg_test_fsync.c
index ddabf64c58..1be017fcd5 100644
--- a/src/bin/pg_test_fsync/pg_test_fsync.c
+++ b/src/bin/pg_test_fsync/pg_test_fsync.c
@@ -303,12 +303,12 @@ test_sync(int writes_per_op)
printf(_("(in wal_sync_method preference order, except fdatasync is Linux's default)\n"));
/*
- * Test open_datasync if available
+ * Test open_datasync direct if available
*/
- printf(LABEL_FORMAT, "open_datasync");
+ printf(LABEL_FORMAT, "open_datasync (direct)");
fflush(stdout);
-#ifdef OPEN_DATASYNC_FLAG
+#if defined(OPEN_DATASYNC_FLAG) && (defined(O_DIRECT) || defined(F_NOCACHE))
if ((tmpfile = open_direct(filename, O_RDWR | O_DSYNC | PG_BINARY, 0)) == -1)
{
printf(NA_FORMAT, _("n/a*"));
@@ -333,6 +333,38 @@ test_sync(int writes_per_op)
printf(NA_FORMAT, _("n/a"));
#endif
+ /*
+ * Test open_datasync buffered if available
+ */
+ printf(LABEL_FORMAT, "open_datasync (buffered)");
+ fflush(stdout);
+
+#ifdef OPEN_DATASYNC_FLAG
+ if ((tmpfile = open(filename, O_RDWR | O_DSYNC | PG_BINARY, 0)) == -1)
+ {
+ printf(NA_FORMAT, _("n/a*"));
+ fs_warning = true;
+ }
+ else
+ {
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ for (writes = 0; writes < writes_per_op; writes++)
+ if (pg_pwrite(tmpfile,
+ buf,
+ XLOG_BLCKSZ,
+ writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
+ die("write failed");
+ }
+ STOP_TIMER;
+ close(tmpfile);
+ }
+#else
+ printf(NA_FORMAT, _("n/a"));
+#endif
+
+
/*
* Test fdatasync if available
*/
@@ -409,13 +441,13 @@ test_sync(int writes_per_op)
printf(NA_FORMAT, _("n/a"));
#endif
-/*
- * Test open_sync if available
- */
- printf(LABEL_FORMAT, "open_sync");
+ /*
+ * Test open_sync if available
+ */
+ printf(LABEL_FORMAT, "open_sync (direct)");
fflush(stdout);
-#ifdef OPEN_SYNC_FLAG
+#if defined(OPEN_SYNC_FLAG) && (defined(O_DIRECT) || defined(F_NOCACHE))
if ((tmpfile = open_direct(filename, O_RDWR | OPEN_SYNC_FLAG | PG_BINARY, 0)) == -1)
{
printf(NA_FORMAT, _("n/a*"));
@@ -447,6 +479,45 @@ test_sync(int writes_per_op)
printf(NA_FORMAT, _("n/a"));
#endif
+ /*
+ * Test open_sync if available
+ */
+ printf(LABEL_FORMAT, "open_sync (buffered)");
+ fflush(stdout);
+
+#ifdef OPEN_SYNC_FLAG
+ if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG | PG_BINARY, 0)) == -1)
+ {
+ printf(NA_FORMAT, _("n/a*"));
+ fs_warning = true;
+ }
+ else
+ {
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ for (writes = 0; writes < writes_per_op; writes++)
+ if (pg_pwrite(tmpfile,
+ buf,
+ XLOG_BLCKSZ,
+ writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
+
+ /*
+ * This can generate write failures if the filesystem has
+ * a large block size, e.g. 4k, and there is no support
+ * for O_DIRECT writes smaller than the file system block
+ * size, e.g. XFS.
+ */
+ die("write failed");
+ }
+ STOP_TIMER;
+ close(tmpfile);
+ }
+#else
+ printf(NA_FORMAT, _("n/a"));
+#endif
+
+
if (fs_warning)
{
printf(_("* This file system and its mount options do not support direct\n"
--
2.33.1