]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
In XLogFileInit(), fix *use_existent postcondition to suit callers.
authorNoah Misch <noah@leadboat.com>
Tue, 29 Jun 2021 01:34:55 +0000 (18:34 -0700)
committerNoah Misch <noah@leadboat.com>
Tue, 29 Jun 2021 01:34:55 +0000 (18:34 -0700)
Infrequently, the mismatch caused log_checkpoints messages and
TRACE_POSTGRESQL_CHECKPOINT_DONE() to witness an "added" count too high
by one.  Since that consequence is so minor, no back-patch.

Discussion: https://postgr.es/m/20210202151416.GB3304930@rfd.leadboat.com

src/backend/access/transam/xlog.c

index 39a38ba0c3e577023beb349ed4b049d610eecb95..073dabc96dc45ae170d9b8998f70d4167edfc419 100644 (file)
@@ -3261,8 +3261,8 @@ XLogNeedsFlush(XLogRecPtr record)
  * logsegno: identify segment to be created/opened.
  *
  * *use_existent: if true, OK to use a pre-existing file (else, any
- * pre-existing file will be deleted).  On return, true if a pre-existing
- * file was used.
+ * pre-existing file will be deleted).  On return, false iff this call added
+ * some segment on disk.
  *
  * Returns FD of opened file.
  *
@@ -3431,8 +3431,10 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent)
         * CheckPointSegments.
         */
        max_segno = logsegno + CheckPointSegments;
-       if (!InstallXLogFileSegment(&installed_segno, tmppath,
-                                                               *use_existent, max_segno))
+       if (InstallXLogFileSegment(&installed_segno, tmppath,
+                                                          *use_existent, max_segno))
+               *use_existent = false;
+       else
        {
                /*
                 * No need for any more future segments, or InstallXLogFileSegment()
@@ -3442,9 +3444,6 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent)
                unlink(tmppath);
        }
 
-       /* Set flag to tell caller there was no existent file */
-       *use_existent = false;
-
        /* Now open original target segment (might not be file I just made) */
        fd = BasicOpenFile(path, O_RDWR | PG_BINARY | get_sync_bit(sync_method));
        if (fd < 0)