Skip to content

Commit 8967ddd

Browse files
nmischmichaelpq
authored andcommitted
In XLogFileInit(), fix *use_existent postcondition to suit callers.
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. This commit has been applied as of 85656bc in v15 and newer versions. This is required on stable branches of v13 and v14 to fix a regression reported by Noah Misch, introduced by 1f95181, causing spurious failures in archive recovery (neither streaming nor archive recovery) with concurrent restartpoints. The backpatched versions of the patches have been aligned on these branches by me, Noah Misch is the author. Tests have been conducted by the both of us. Reported-by: Arun Thirupathi Author: Noah Misch <noah@leadboat.com> Discussion: https://postgr.es/m/20210202151416.GB3304930@rfd.leadboat.com Discussion: https://postgr.es/m/20250306193013.36.nmisch@google.com Backpatch-through: 13
1 parent 6b168c1 commit 8967ddd

File tree

1 file changed

+6
-7
lines changed
  • src/backend/access/transam

1 file changed

+6
-7
lines changed

src/backend/access/transam/xlog.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3289,8 +3289,8 @@ XLogNeedsFlush(XLogRecPtr record)
32893289
* logsegno: identify segment to be created/opened.
32903290
*
32913291
* *use_existent: if true, OK to use a pre-existing file (else, any
3292-
* pre-existing file will be deleted). On return, true if a pre-existing
3293-
* file was used.
3292+
* pre-existing file will be deleted). On return, false iff this call added
3293+
* some segment on disk.
32943294
*
32953295
* Returns FD of opened file.
32963296
*
@@ -3459,8 +3459,10 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent)
34593459
* CheckPointSegments.
34603460
*/
34613461
max_segno = logsegno + CheckPointSegments;
3462-
if (!InstallXLogFileSegment(&installed_segno, tmppath,
3463-
*use_existent, max_segno))
3462+
if (InstallXLogFileSegment(&installed_segno, tmppath,
3463+
*use_existent, max_segno))
3464+
*use_existent = false;
3465+
else
34643466
{
34653467
/*
34663468
* No need for any more future segments, or InstallXLogFileSegment()
@@ -3470,9 +3472,6 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent)
34703472
unlink(tmppath);
34713473
}
34723474

3473-
/* Set flag to tell caller there was no existent file */
3474-
*use_existent = false;
3475-
34763475
/* Now open original target segment (might not be file I just made) */
34773476
fd = BasicOpenFile(path, O_RDWR | PG_BINARY | get_sync_bit(sync_method));
34783477
if (fd < 0)

0 commit comments

Comments
 (0)