Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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:31:57 +0000 (10:31 +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 501bc20a96af85041eafd360f2cc11c80cc3b02f..a8d1080f1754dde9a132ddc308d69da559a4b519 100644 (file)
@@ -837,13 +837,6 @@ CheckPointCLOG(void)
    /* Flush dirty CLOG pages to disk */
    TRACE_POSTGRESQL_CLOG_CHECKPOINT_START(true);
    SimpleLruFlush(ClogCtl, 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 599203c96ce8f09598955764a9cfad11a9395504..6c4911d9bcf7333354bf17db668d62906c2770f2 100644 (file)
@@ -761,12 +761,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 67387979bdbbcc85f66f303715c1c9f076057dec..cfe9513827564e425f8225a7ef48f892bad0033a 100644 (file)
@@ -1159,6 +1159,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);
 }
 
 /*