Hi,

I'd like to propose to remove "whichChkpt" and "report" arguments in ReadCheckpointRecord(). 
"report" is obviously useless because it's always true, i.e., there are two callers of the function and they 
always specify true as "report".

"whichChkpt" indicates where the specified checkpoint location came from, 
pg_control or backup_label. This information is used to log different messages as follows.

                switch (whichChkpt)
                {
                        case 1:
                                ereport(LOG,
                                                (errmsg("invalid primary checkpoint 
link in control file")));
                                break;
                        default:
                                ereport(LOG,
                                                (errmsg("invalid checkpoint link in 
backup_label file")));
                                break;
                }
                return NULL;
                ...
                switch (whichChkpt)
                {
                        case 1:
                                ereport(LOG,
                                                (errmsg("invalid primary checkpoint 
record")));
                                break;
                        default:
                                ereport(LOG,
                                                (errmsg("invalid checkpoint 
record")));
                                break;
                }
                return NULL;
                ...

But the callers of ReadCheckpointRecord() already output different log messages depending 
on where the invalid checkpoint record came from. So even if ReadCheckpointRecord() 
doesn't use "whichChkpt", i.e., use the same log message in both pg_control and 
backup_label cases, users can still identify where the invalid checkpoint record came 
from, by reading the log message.

Also when whichChkpt = 0, "primary checkpoint" is used in the log message and 
sounds confusing because, as far as I recall correctly, we removed the concept of primary 
and secondary checkpoints before.

 Therefore I think that it's better to remove "whichChkpt" argument in 
ReadCheckpointRecord().

Patch attached. Thought?

Regards,

--
Fujii Masao
Advanced Computing Technology Center
Research and Development Headquarters
NTT DATA CORPORATION
From a33e557a18cf5c45bbcf47f1cf92e26998f1cd67 Mon Sep 17 00:00:00 2001
From: Fujii Masao <fu...@postgresql.org>
Date: Wed, 20 Jul 2022 23:06:44 +0900
Subject: [PATCH] Remove useless arguments in ReadCheckpointRecord().

---
 src/backend/access/transam/xlogrecovery.c | 84 ++++-------------------
 1 file changed, 15 insertions(+), 69 deletions(-)

diff --git a/src/backend/access/transam/xlogrecovery.c 
b/src/backend/access/transam/xlogrecovery.c
index 5d6f1b5e46..e383c2123a 100644
--- a/src/backend/access/transam/xlogrecovery.c
+++ b/src/backend/access/transam/xlogrecovery.c
@@ -422,8 +422,8 @@ static XLogPageReadResult 
WaitForWALToBecomeAvailable(XLogRecPtr RecPtr,
                                                                                
                          XLogRecPtr replayLSN,
                                                                                
                          bool nonblocking);
 static int     emode_for_corrupt_record(int emode, XLogRecPtr RecPtr);
-static XLogRecord *ReadCheckpointRecord(XLogPrefetcher *xlogprefetcher, 
XLogRecPtr RecPtr,
-                                                                               
int whichChkpt, bool report, TimeLineID replayTLI);
+static XLogRecord *ReadCheckpointRecord(XLogPrefetcher *xlogprefetcher,
+                                                                               
XLogRecPtr RecPtr, TimeLineID replayTLI);
 static bool rescanLatestTimeLine(TimeLineID replayTLI, XLogRecPtr replayLSN);
 static int     XLogFileRead(XLogSegNo segno, int emode, TimeLineID tli,
                                                 XLogSource source, bool 
notfoundOk);
@@ -605,7 +605,7 @@ InitWalRecovery(ControlFileData *ControlFile, bool 
*wasShutdown_ptr,
                 * When a backup_label file is present, we want to roll forward 
from
                 * the checkpoint it identifies, rather than using pg_control.
                 */
-               record = ReadCheckpointRecord(xlogprefetcher, CheckPointLoc, 0, 
true,
+               record = ReadCheckpointRecord(xlogprefetcher, CheckPointLoc,
                                                                          
CheckPointTLI);
                if (record != NULL)
                {
@@ -744,7 +744,7 @@ InitWalRecovery(ControlFileData *ControlFile, bool 
*wasShutdown_ptr,
                CheckPointTLI = ControlFile->checkPointCopy.ThisTimeLineID;
                RedoStartLSN = ControlFile->checkPointCopy.redo;
                RedoStartTLI = ControlFile->checkPointCopy.ThisTimeLineID;
-               record = ReadCheckpointRecord(xlogprefetcher, CheckPointLoc, 1, 
true,
+               record = ReadCheckpointRecord(xlogprefetcher, CheckPointLoc,
                                                                          
CheckPointTLI);
                if (record != NULL)
                {
@@ -3843,13 +3843,10 @@ emode_for_corrupt_record(int emode, XLogRecPtr RecPtr)
 
 /*
  * Subroutine to try to fetch and validate a prior checkpoint record.
- *
- * whichChkpt identifies the checkpoint (merely for reporting purposes).
- * 1 for "primary", 0 for "other" (backup_label)
  */
 static XLogRecord *
 ReadCheckpointRecord(XLogPrefetcher *xlogprefetcher, XLogRecPtr RecPtr,
-                                        int whichChkpt, bool report, 
TimeLineID replayTLI)
+                                        TimeLineID replayTLI)
 {
        XLogRecord *record;
        uint8           info;
@@ -3858,20 +3855,8 @@ ReadCheckpointRecord(XLogPrefetcher *xlogprefetcher, 
XLogRecPtr RecPtr,
 
        if (!XRecOffIsValid(RecPtr))
        {
-               if (!report)
-                       return NULL;
-
-               switch (whichChkpt)
-               {
-                       case 1:
-                               ereport(LOG,
-                                               (errmsg("invalid primary 
checkpoint link in control file")));
-                               break;
-                       default:
-                               ereport(LOG,
-                                               (errmsg("invalid checkpoint 
link in backup_label file")));
-                               break;
-               }
+               ereport(LOG,
+                               (errmsg("invalid checkpoint location")));
                return NULL;
        }
 
@@ -3880,67 +3865,28 @@ ReadCheckpointRecord(XLogPrefetcher *xlogprefetcher, 
XLogRecPtr RecPtr,
 
        if (record == NULL)
        {
-               if (!report)
-                       return NULL;
-
-               switch (whichChkpt)
-               {
-                       case 1:
-                               ereport(LOG,
-                                               (errmsg("invalid primary 
checkpoint record")));
-                               break;
-                       default:
-                               ereport(LOG,
-                                               (errmsg("invalid checkpoint 
record")));
-                               break;
-               }
+               ereport(LOG,
+                               (errmsg("invalid checkpoint record")));
                return NULL;
        }
        if (record->xl_rmid != RM_XLOG_ID)
        {
-               switch (whichChkpt)
-               {
-                       case 1:
-                               ereport(LOG,
-                                               (errmsg("invalid resource 
manager ID in primary checkpoint record")));
-                               break;
-                       default:
-                               ereport(LOG,
-                                               (errmsg("invalid resource 
manager ID in checkpoint record")));
-                               break;
-               }
+               ereport(LOG,
+                               (errmsg("invalid resource manager ID in 
checkpoint record")));
                return NULL;
        }
        info = record->xl_info & ~XLR_INFO_MASK;
        if (info != XLOG_CHECKPOINT_SHUTDOWN &&
                info != XLOG_CHECKPOINT_ONLINE)
        {
-               switch (whichChkpt)
-               {
-                       case 1:
-                               ereport(LOG,
-                                               (errmsg("invalid xl_info in 
primary checkpoint record")));
-                               break;
-                       default:
-                               ereport(LOG,
-                                               (errmsg("invalid xl_info in 
checkpoint record")));
-                               break;
-               }
+               ereport(LOG,
+                               (errmsg("invalid xl_info in checkpoint 
record")));
                return NULL;
        }
        if (record->xl_tot_len != SizeOfXLogRecord + 
SizeOfXLogRecordDataHeaderShort + sizeof(CheckPoint))
        {
-               switch (whichChkpt)
-               {
-                       case 1:
-                               ereport(LOG,
-                                               (errmsg("invalid length of 
primary checkpoint record")));
-                               break;
-                       default:
-                               ereport(LOG,
-                                               (errmsg("invalid length of 
checkpoint record")));
-                               break;
-               }
+               ereport(LOG,
+                               (errmsg("invalid length of checkpoint 
record")));
                return NULL;
        }
        return record;
-- 
2.36.0

Reply via email to