Remove XLogFileInit() ability to unlink a pre-existing file.
authorNoah Misch <noah@leadboat.com>
Tue, 29 Jun 2021 01:34:56 +0000 (18:34 -0700)
committerNoah Misch <noah@leadboat.com>
Tue, 29 Jun 2021 01:34:56 +0000 (18:34 -0700)
Only initdb used it.  initdb refuses to operate on a non-empty directory
and generally does not cope with pre-existing files of other kinds.
Hence, use the opportunity to simplify.

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

src/backend/access/transam/xlog.c
src/backend/replication/walreceiver.c
src/include/access/xlog.h

index 073dabc96dc45ae170d9b8998f70d4167edfc419..1a31788071cf47a05aff2404eb50fd64c19a30b0 100644 (file)
@@ -2424,7 +2424,7 @@ XLogWrite(XLogwrtRqst WriteRqst, bool flexible)
        bool            ispartialpage;
        bool            last_iteration;
        bool            finishing_seg;
-       bool            use_existent;
+       bool            added;
        int                     curridx;
        int                     npages;
        int                     startidx;
@@ -2490,8 +2490,7 @@ XLogWrite(XLogwrtRqst WriteRqst, bool flexible)
                                                        wal_segment_size);
 
                        /* create/use new log file */
-                       use_existent = true;
-                       openLogFile = XLogFileInit(openLogSegNo, &use_existent);
+                       openLogFile = XLogFileInit(openLogSegNo, &added);
                        ReserveExternalFD();
                }
 
@@ -3260,9 +3259,7 @@ 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, false iff this call added
- * some segment on disk.
+ * *added: on return, true if this call raised the number of extant segments.
  *
  * Returns FD of opened file.
  *
@@ -3272,7 +3269,7 @@ XLogNeedsFlush(XLogRecPtr record)
  * in a critical section.
  */
 int
-XLogFileInit(XLogSegNo logsegno, bool *use_existent)
+XLogFileInit(XLogSegNo logsegno, bool *added)
 {
        char            path[MAXPGPATH];
        char            tmppath[MAXPGPATH];
@@ -3287,19 +3284,17 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent)
        /*
         * Try to use existent file (checkpoint maker may have created it already)
         */
-       if (*use_existent)
+       *added = false;
+       fd = BasicOpenFile(path, O_RDWR | PG_BINARY | get_sync_bit(sync_method));
+       if (fd < 0)
        {
-               fd = BasicOpenFile(path, O_RDWR | PG_BINARY | get_sync_bit(sync_method));
-               if (fd < 0)
-               {
-                       if (errno != ENOENT)
-                               ereport(ERROR,
-                                               (errcode_for_file_access(),
-                                                errmsg("could not open file \"%s\": %m", path)));
-               }
-               else
-                       return fd;
+               if (errno != ENOENT)
+                       ereport(ERROR,
+                                       (errcode_for_file_access(),
+                                        errmsg("could not open file \"%s\": %m", path)));
        }
+       else
+               return fd;
 
        /*
         * Initialize an empty (all zeroes) segment.  NOTE: it is possible that
@@ -3412,12 +3407,9 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent)
                                 errmsg("could not close file \"%s\": %m", tmppath)));
 
        /*
-        * Now move the segment into place with its final name.
-        *
-        * If caller didn't want to use a pre-existing file, get rid of any
-        * pre-existing file.  Otherwise, cope with possibility that someone else
-        * has created the file while we were filling ours: if so, use ours to
-        * pre-create a future log segment.
+        * Now move the segment into place with its final name.  Cope with
+        * possibility that someone else has created the file while we were
+        * filling ours: if so, use ours to pre-create a future log segment.
         */
        installed_segno = logsegno;
 
@@ -3431,9 +3423,8 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent)
         * CheckPointSegments.
         */
        max_segno = logsegno + CheckPointSegments;
-       if (InstallXLogFileSegment(&installed_segno, tmppath,
-                                                          *use_existent, max_segno))
-               *use_existent = false;
+       if (InstallXLogFileSegment(&installed_segno, tmppath, true, max_segno))
+               *added = true;
        else
        {
                /*
@@ -3918,7 +3909,7 @@ PreallocXlogFiles(XLogRecPtr endptr)
 {
        XLogSegNo       _logSegNo;
        int                     lf;
-       bool            use_existent;
+       bool            added;
        uint64          offset;
 
        XLByteToPrevSeg(endptr, _logSegNo, wal_segment_size);
@@ -3926,10 +3917,9 @@ PreallocXlogFiles(XLogRecPtr endptr)
        if (offset >= (uint32) (0.75 * wal_segment_size))
        {
                _logSegNo++;
-               use_existent = true;
-               lf = XLogFileInit(_logSegNo, &use_existent);
+               lf = XLogFileInit(_logSegNo, &added);
                close(lf);
-               if (!use_existent)
+               if (added)
                        CheckpointStats.ckpt_segs_added++;
        }
 }
@@ -5224,7 +5214,7 @@ BootStrapXLOG(void)
        XLogLongPageHeader longpage;
        XLogRecord *record;
        char       *recptr;
-       bool            use_existent;
+       bool            added;
        uint64          sysidentifier;
        struct timeval tv;
        pg_crc32c       crc;
@@ -5321,8 +5311,7 @@ BootStrapXLOG(void)
        record->xl_crc = crc;
 
        /* Create first XLOG segment file */
-       use_existent = false;
-       openLogFile = XLogFileInit(1, &use_existent);
+       openLogFile = XLogFileInit(1, &added);
 
        /*
         * We needn't bother with Reserve/ReleaseExternalFD here, since we'll
@@ -5628,10 +5617,10 @@ exitArchiveRecovery(TimeLineID endTLI, XLogRecPtr endOfLog)
                 * The switch happened at a segment boundary, so just create the next
                 * segment on the new timeline.
                 */
-               bool            use_existent = true;
+               bool            added;
                int                     fd;
 
-               fd = XLogFileInit(startLogSegNo, &use_existent);
+               fd = XLogFileInit(startLogSegNo, &added);
 
                if (close(fd) != 0)
                {
index b00066ed2a71f7ca0f89abc17a11795368cd37c0..eadff8f908fe60a82270fe2ab8e5ff927f696e80 100644 (file)
@@ -885,7 +885,7 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr)
 
                if (recvFile < 0 || !XLByteInSeg(recptr, recvSegNo, wal_segment_size))
                {
-                       bool            use_existent;
+                       bool            added;
 
                        /*
                         * fsync() and close current file before we switch to next one. We
@@ -923,8 +923,7 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr)
 
                        /* Create/use new log file */
                        XLByteToSeg(recptr, recvSegNo, wal_segment_size);
-                       use_existent = true;
-                       recvFile = XLogFileInit(recvSegNo, &use_existent);
+                       recvFile = XLogFileInit(recvSegNo, &added);
                        recvFileTLI = ThisTimeLineID;
                }
 
index a1756490bf86ef2cfac003349e945001931e66ba..d8b8f59c4bd79a16e4d3d6de037dfd511fa52e5b 100644 (file)
@@ -296,7 +296,7 @@ extern XLogRecPtr XLogInsertRecord(struct XLogRecData *rdata,
 extern void XLogFlush(XLogRecPtr RecPtr);
 extern bool XLogBackgroundFlush(void);
 extern bool XLogNeedsFlush(XLogRecPtr RecPtr);
-extern int     XLogFileInit(XLogSegNo segno, bool *use_existent);
+extern int     XLogFileInit(XLogSegNo segno, bool *added);
 extern int     XLogFileOpen(XLogSegNo segno);
 
 extern void CheckXLogRemoved(XLogSegNo segno, TimeLineID tli);