Fix missing fsync of SLRU directories.
authorThomas Munro <tmunro@postgresql.org>
Wed, 23 Sep 2020 21:26:09 +0000 (09:26 +1200)
committerThomas Munro <tmunro@postgresql.org>
Wed, 23 Sep 2020 22:39:52 +0000 (10:39 +1200)
Harmonize behavior by moving reponsibility for fsyncing directories down
into slru.c.  In 10 and later, only the multixact directories were
missed (see commit 1b02be21), and in older branches all SLRUs were
missed.

Back-patch to all supported releases.

Reviewed-by: Andres Freund <andres@anarazel.de>
Reviewed-by: Michael Paquier <michael@paquier.xyz>
Discussion: https://postgr.es/m/CA%2BhUKGLtsTUOScnNoSMZ-2ZLv%2BwGh01J6kAo_DM8mTRq1sKdSQ%40mail.gmail.com

src/backend/access/transam/clog.c
src/backend/access/transam/commit_ts.c
src/backend/access/transam/slru.c

index 65aa8841f7ce0175d4b45986690f3d4f90700a89..9e352d26583541647facb81e76d6d5711d8a0bd0 100644 (file)
@@ -836,13 +836,6 @@ CheckPointCLOG(void)
    /* Flush dirty CLOG pages to disk */
    TRACE_POSTGRESQL_CLOG_CHECKPOINT_START(true);
    SimpleLruFlush(XactCtl, true);
-
-   /*
-    * fsync pg_xact to ensure that any files flushed previously are durably
-    * on disk.
-    */
-   fsync_fname("pg_xact", true);
-
    TRACE_POSTGRESQL_CLOG_CHECKPOINT_DONE(true);
 }
 
index 5244b06a2b651aa3b2fe6d06bb3b04c84dd61ee9..f6a7329ba3a5dc75c29b9f5aff3a0d7366210ce0 100644 (file)
@@ -822,12 +822,6 @@ CheckPointCommitTs(void)
 {
    /* Flush dirty CommitTs pages to disk */
    SimpleLruFlush(CommitTsCtl, true);
-
-   /*
-    * fsync pg_commit_ts to ensure that any files flushed previously are
-    * durably on disk.
-    */
-   fsync_fname("pg_commit_ts", true);
 }
 
 /*
index 7640f153c227bcfebe06c21599469e8dc9fd39a6..fe7d759a8c1cceaf8116a2f51888a819218b5393 100644 (file)
@@ -1187,6 +1187,10 @@ SimpleLruFlush(SlruCtl ctl, bool allow_redirtied)
    }
    if (!ok)
        SlruReportIOError(ctl, pageno, InvalidTransactionId);
+
+   /* Ensure that directory entries for new files are on disk. */
+   if (ctl->do_fsync)
+       fsync_fname(ctl->Dir, true);
 }
 
 /*