Factor out InitControlFile() from BootStrapXLOG()
authorPeter Eisentraut <peter@eisentraut.org>
Mon, 17 Feb 2020 16:58:02 +0000 (17:58 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Sat, 22 Feb 2020 11:09:27 +0000 (12:09 +0100)
Right now this only makes BootStrapXLOG() a bit more manageable, but
in the future there may be external callers.

Discussion: https://www.postgresql.org/message-id/e8f86ba5-48f1-a80a-7f1d-b76bcb9c5c47@2ndquadrant.com

src/backend/access/transam/xlog.c

index b017fd286f2bc3c361595e91548288671aec2d19..fd527f20c504adfbd133948e0b9ed1ddebbf8e89 100644 (file)
@@ -903,6 +903,7 @@ static void CheckRecoveryConsistency(void);
 static XLogRecord *ReadCheckpointRecord(XLogReaderState *xlogreader,
                                        XLogRecPtr RecPtr, int whichChkpt, bool report);
 static bool rescanLatestTimeLine(void);
+static void InitControlFile(uint64 sysidentifier);
 static void WriteControlFile(void);
 static void ReadControlFile(void);
 static char *str_time(pg_time_t tnow);
@@ -4486,12 +4487,49 @@ rescanLatestTimeLine(void)
  * given a preloaded buffer, ReadControlFile() loads the buffer from
  * the pg_control file (during postmaster or standalone-backend startup),
  * and UpdateControlFile() rewrites pg_control after we modify xlog state.
+ * InitControlFile() fills the buffer with initial values.
  *
  * For simplicity, WriteControlFile() initializes the fields of pg_control
  * that are related to checking backend/database compatibility, and
  * ReadControlFile() verifies they are correct.  We could split out the
  * I/O and compatibility-check functions, but there seems no need currently.
  */
+
+static void
+InitControlFile(uint64 sysidentifier)
+{
+   char        mock_auth_nonce[MOCK_AUTH_NONCE_LEN];
+
+   /*
+    * Generate a random nonce. This is used for authentication requests that
+    * will fail because the user does not exist. The nonce is used to create
+    * a genuine-looking password challenge for the non-existent user, in lieu
+    * of an actual stored password.
+    */
+   if (!pg_strong_random(mock_auth_nonce, MOCK_AUTH_NONCE_LEN))
+       ereport(PANIC,
+               (errcode(ERRCODE_INTERNAL_ERROR),
+                errmsg("could not generate secret authorization token")));
+
+   memset(ControlFile, 0, sizeof(ControlFileData));
+   /* Initialize pg_control status fields */
+   ControlFile->system_identifier = sysidentifier;
+   memcpy(ControlFile->mock_authentication_nonce, mock_auth_nonce, MOCK_AUTH_NONCE_LEN);
+   ControlFile->state = DB_SHUTDOWNED;
+   ControlFile->unloggedLSN = FirstNormalUnloggedLSN;
+
+   /* Set important parameter values for use when replaying WAL */
+   ControlFile->MaxConnections = MaxConnections;
+   ControlFile->max_worker_processes = max_worker_processes;
+   ControlFile->max_wal_senders = max_wal_senders;
+   ControlFile->max_prepared_xacts = max_prepared_xacts;
+   ControlFile->max_locks_per_xact = max_locks_per_xact;
+   ControlFile->wal_level = wal_level;
+   ControlFile->wal_log_hints = wal_log_hints;
+   ControlFile->track_commit_timestamp = track_commit_timestamp;
+   ControlFile->data_checksum_version = bootstrap_data_checksum_version;
+}
+
 static void
 WriteControlFile(void)
 {
@@ -5088,7 +5126,6 @@ BootStrapXLOG(void)
    char       *recptr;
    bool        use_existent;
    uint64      sysidentifier;
-   char        mock_auth_nonce[MOCK_AUTH_NONCE_LEN];
    struct timeval tv;
    pg_crc32c   crc;
 
@@ -5109,17 +5146,6 @@ BootStrapXLOG(void)
    sysidentifier |= ((uint64) tv.tv_usec) << 12;
    sysidentifier |= getpid() & 0xFFF;
 
-   /*
-    * Generate a random nonce. This is used for authentication requests that
-    * will fail because the user does not exist. The nonce is used to create
-    * a genuine-looking password challenge for the non-existent user, in lieu
-    * of an actual stored password.
-    */
-   if (!pg_strong_random(mock_auth_nonce, MOCK_AUTH_NONCE_LEN))
-       ereport(PANIC,
-               (errcode(ERRCODE_INTERNAL_ERROR),
-                errmsg("could not generate secret authorization token")));
-
    /* First timeline ID is always 1 */
    ThisTimeLineID = 1;
 
@@ -5227,30 +5253,12 @@ BootStrapXLOG(void)
    openLogFile = -1;
 
    /* Now create pg_control */
-
-   memset(ControlFile, 0, sizeof(ControlFileData));
-   /* Initialize pg_control status fields */
-   ControlFile->system_identifier = sysidentifier;
-   memcpy(ControlFile->mock_authentication_nonce, mock_auth_nonce, MOCK_AUTH_NONCE_LEN);
-   ControlFile->state = DB_SHUTDOWNED;
+   InitControlFile(sysidentifier);
    ControlFile->time = checkPoint.time;
    ControlFile->checkPoint = checkPoint.redo;
    ControlFile->checkPointCopy = checkPoint;
-   ControlFile->unloggedLSN = FirstNormalUnloggedLSN;
-
-   /* Set important parameter values for use when replaying WAL */
-   ControlFile->MaxConnections = MaxConnections;
-   ControlFile->max_worker_processes = max_worker_processes;
-   ControlFile->max_wal_senders = max_wal_senders;
-   ControlFile->max_prepared_xacts = max_prepared_xacts;
-   ControlFile->max_locks_per_xact = max_locks_per_xact;
-   ControlFile->wal_level = wal_level;
-   ControlFile->wal_log_hints = wal_log_hints;
-   ControlFile->track_commit_timestamp = track_commit_timestamp;
-   ControlFile->data_checksum_version = bootstrap_data_checksum_version;
 
    /* some additional ControlFile fields are set in WriteControlFile() */
-
    WriteControlFile();
 
    /* Bootstrap the commit log, too */