Fix missing fsync of SLRU directories.
authorThomas Munro
Wed, 23 Sep 2020 21:26:09 +0000 (09:26 +1200)
committerThomas Munro
Wed, 23 Sep 2020 22:27:22 +0000 (10:27 +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
Reviewed-by: Michael Paquier
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 f3da40ae017faf8ef1d220701b7715164d6182eb..fa3763b478d8f7553af6024633dc9f2a52cda47e 100644 (file)
@@ -837,13 +837,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 9cdb1364359c188ceb8b901f9d57640c542cefd6..7ae497ff00054400ffe1c9c86c25bd1250fad1c7 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 275058036a2e6de8bebe6fb746a71a19d73156c5..64aabc564f869f2c3c0911e6d1ebaf3aac3bace7 100644 (file)
@@ -1204,6 +1204,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);
 }
 
 /*