Extract code to describe recovery stop reason to a function.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Sat, 31 Jul 2021 06:49:30 +0000 (09:49 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Sat, 31 Jul 2021 06:49:30 +0000 (09:49 +0300)
StartupXLOG() is very long, this makes it a little bit more readable.

Reviewed-by: Andres Freund
Discussion: https://www.postgresql.org/message-id/b3b71061-4919-e882-4857-27e370ab134a%40iki.fi

src/backend/access/transam/xlog.c

index fb4186ee10d082c82453a48843048ce00edd20d4..1e601d6282fcf0562be56dbf528ad87085f88801 100644 (file)
@@ -901,6 +901,7 @@ static void validateRecoveryParameters(void);
 static void exitArchiveRecovery(TimeLineID endTLI, XLogRecPtr endOfLog);
 static bool recoveryStopsBefore(XLogReaderState *record);
 static bool recoveryStopsAfter(XLogReaderState *record);
+static char *getRecoveryStopReason(void);
 static void ConfirmRecoveryPaused(void);
 static void recoveryPausesHere(bool endOfRecovery);
 static bool recoveryApplyDelay(XLogReaderState *record);
@@ -6059,6 +6060,42 @@ recoveryStopsAfter(XLogReaderState *record)
        return false;
 }
 
+/*
+ * Create a comment for the history file to explain why and where
+ * timeline changed.
+ */
+static char *
+getRecoveryStopReason(void)
+{
+       char            reason[200];
+
+       if (recoveryTarget == RECOVERY_TARGET_XID)
+               snprintf(reason, sizeof(reason),
+                                "%s transaction %u",
+                                recoveryStopAfter ? "after" : "before",
+                                recoveryStopXid);
+       else if (recoveryTarget == RECOVERY_TARGET_TIME)
+               snprintf(reason, sizeof(reason),
+                                "%s %s\n",
+                                recoveryStopAfter ? "after" : "before",
+                                timestamptz_to_str(recoveryStopTime));
+       else if (recoveryTarget == RECOVERY_TARGET_LSN)
+               snprintf(reason, sizeof(reason),
+                                "%s LSN %X/%X\n",
+                                recoveryStopAfter ? "after" : "before",
+                                LSN_FORMAT_ARGS(recoveryStopLSN));
+       else if (recoveryTarget == RECOVERY_TARGET_NAME)
+               snprintf(reason, sizeof(reason),
+                                "at restore point \"%s\"",
+                                recoveryStopName);
+       else if (recoveryTarget == RECOVERY_TARGET_IMMEDIATE)
+               snprintf(reason, sizeof(reason), "reached consistency");
+       else
+               snprintf(reason, sizeof(reason), "no recovery target specified");
+
+       return pstrdup(reason);
+}
+
 /*
  * Wait until shared recoveryPauseState is set to RECOVERY_NOT_PAUSED.
  *
@@ -7756,7 +7793,7 @@ StartupXLOG(void)
        PrevTimeLineID = ThisTimeLineID;
        if (ArchiveRecoveryRequested)
        {
-               char            reason[200];
+               char       *reason;
                char            recoveryPath[MAXPGPATH];
 
                Assert(InArchiveRecovery);
@@ -7765,33 +7802,7 @@ StartupXLOG(void)
                ereport(LOG,
                                (errmsg("selected new timeline ID: %u", ThisTimeLineID)));
 
-               /*
-                * Create a comment for the history file to explain why and where
-                * timeline changed.
-                */
-               if (recoveryTarget == RECOVERY_TARGET_XID)
-                       snprintf(reason, sizeof(reason),
-                                        "%s transaction %u",
-                                        recoveryStopAfter ? "after" : "before",
-                                        recoveryStopXid);
-               else if (recoveryTarget == RECOVERY_TARGET_TIME)
-                       snprintf(reason, sizeof(reason),
-                                        "%s %s\n",
-                                        recoveryStopAfter ? "after" : "before",
-                                        timestamptz_to_str(recoveryStopTime));
-               else if (recoveryTarget == RECOVERY_TARGET_LSN)
-                       snprintf(reason, sizeof(reason),
-                                        "%s LSN %X/%X\n",
-                                        recoveryStopAfter ? "after" : "before",
-                                        LSN_FORMAT_ARGS(recoveryStopLSN));
-               else if (recoveryTarget == RECOVERY_TARGET_NAME)
-                       snprintf(reason, sizeof(reason),
-                                        "at restore point \"%s\"",
-                                        recoveryStopName);
-               else if (recoveryTarget == RECOVERY_TARGET_IMMEDIATE)
-                       snprintf(reason, sizeof(reason), "reached consistency");
-               else
-                       snprintf(reason, sizeof(reason), "no recovery target specified");
+               reason = getRecoveryStopReason();
 
                /*
                 * We are now done reading the old WAL.  Turn off archive fetching if