Demote ThisTimeLineID to a local variable. ThisTimeLineID4
authorRobert Haas <[email protected]>
Mon, 1 Nov 2021 18:39:36 +0000 (14:39 -0400)
committerRobert Haas <[email protected]>
Mon, 1 Nov 2021 18:39:36 +0000 (14:39 -0400)
Instead of a file-level global variable, it can now be made local
to StartupXLOG. The only other code that still accesses it is in
BootstrapXLOG, where we now just use a constant instead.

src/backend/access/transam/xlog.c

index 8a650b875ea7d8505dc11ccb615fcb15e8546f45..dcc215dcc211a8851e776658ddfb9366317b1d81 100644 (file)
@@ -88,6 +88,9 @@ extern uint32 bootstrap_data_checksum_version;
 #define RECOVERY_COMMAND_FILE  "recovery.conf"
 #define RECOVERY_COMMAND_DONE  "recovery.done"
 
+/* timeline ID to be used when bootstrapping */
+#define BootstrapTimeLineID            1
+
 /* User-settable parameters */
 int                    max_wal_size_mb = 1024; /* 1 GB */
 int                    min_wal_size_mb = 80;   /* 80 MB */
@@ -188,12 +191,6 @@ const struct config_enum_entry recovery_target_action_options[] = {
  */
 CheckpointStatsData CheckpointStats;
 
-/*
- * ThisTimeLineID will be same in all backends --- it identifies current
- * WAL timeline for the database system.
- */
-static TimeLineID      ThisTimeLineID = 0;
-
 static XLogRecPtr LastRec;
 
 /* Local copy of WalRcv->flushedUpto */
@@ -5368,9 +5365,6 @@ BootStrapXLOG(void)
        sysidentifier |= ((uint64) tv.tv_usec) << 12;
        sysidentifier |= getpid() & 0xFFF;
 
-       /* First timeline ID is always 1 */
-       ThisTimeLineID = 1;
-
        /* page buffer must be aligned suitably for O_DIRECT */
        buffer = (char *) palloc(XLOG_BLCKSZ + XLOG_BLCKSZ);
        page = (XLogPageHeader) TYPEALIGN(XLOG_BLCKSZ, buffer);
@@ -5384,8 +5378,8 @@ BootStrapXLOG(void)
         * used, so that we can use 0/0 to mean "before any valid WAL segment".
         */
        checkPoint.redo = wal_segment_size + SizeOfXLogLongPHD;
-       checkPoint.ThisTimeLineID = ThisTimeLineID;
-       checkPoint.PrevTimeLineID = ThisTimeLineID;
+       checkPoint.ThisTimeLineID = BootstrapTimeLineID;
+       checkPoint.PrevTimeLineID = BootstrapTimeLineID;
        checkPoint.fullPageWrites = fullPageWrites;
        checkPoint.nextXid =
                FullTransactionIdFromEpochAndXid(0, FirstNormalTransactionId);
@@ -5413,7 +5407,7 @@ BootStrapXLOG(void)
        /* Set up the XLOG page header */
        page->xlp_magic = XLOG_PAGE_MAGIC;
        page->xlp_info = XLP_LONG_HEADER;
-       page->xlp_tli = ThisTimeLineID;
+       page->xlp_tli = BootstrapTimeLineID;
        page->xlp_pageaddr = wal_segment_size;
        longpage = (XLogLongPageHeader) page;
        longpage->xlp_sysid = sysidentifier;
@@ -5443,8 +5437,8 @@ BootStrapXLOG(void)
        record->xl_crc = crc;
 
        /* Create first XLOG segment file */
-       openLogTLI = ThisTimeLineID;
-       openLogFile = XLogFileInit(1, ThisTimeLineID);
+       openLogTLI = BootstrapTimeLineID;
+       openLogFile = XLogFileInit(1, BootstrapTimeLineID);
 
        /*
         * We needn't bother with Reserve/ReleaseExternalFD here, since we'll
@@ -6681,7 +6675,8 @@ StartupXLOG(void)
                                checkPointLoc,
                                EndOfLog;
        TimeLineID      EndOfLogTLI;
-       TimeLineID      PrevTimeLineID;
+       TimeLineID      ThisTimeLineID,
+                               PrevTimeLineID;
        XLogRecord *record;
        TransactionId oldestActiveXID;
        bool            backupEndRequired = false;
@@ -8661,21 +8656,13 @@ ReadCheckpointRecord(XLogReaderState *xlogreader, XLogRecPtr RecPtr,
 /*
  * This must be called in a backend process before creating WAL records
  * (except in a standalone backend, which does StartupXLOG instead).  We need
- * to initialize the local copies of ThisTimeLineID and RedoRecPtr.
- *
- * Note: before Postgres 8.0, we went to some effort to keep the postmaster
- * process's copies of ThisTimeLineID and RedoRecPtr valid too.  This was
- * unnecessary however, since the postmaster itself never touches XLOG anyway.
+ * to initialize the local copy of RedoRecPtr.
  */
 void
 InitXLOGAccess(void)
 {
        XLogCtlInsert *Insert = &XLogCtl->Insert;
 
-       /* ThisTimeLineID doesn't change so we need no lock to copy it */
-       ThisTimeLineID = XLogCtl->ThisTimeLineID;
-       Assert(ThisTimeLineID != 0 || IsBootstrapProcessingMode());
-
        /* set wal_segment_size */
        wal_segment_size = ControlFile->xlog_seg_size;