Here is a small patch to make some invalid-record error messages in xlogreader a bit more accurate (IMO).

My starting point was that when you have some invalid WAL, you often get a message like "wanted 24, got 0". This is a bit incorrect, since it really wanted *at least* 24, not exactly 24. So I have updated the messages to that effect, and also added that detail to one message where it was available but not printed.

Going through the remaining report_invalid_record() calls I then adjusted the use of "invalid" vs. "incorrect" in one case. The message "record with invalid length" makes it sound like the length was something like -5, but really we know what the length should be and what we got wasn't it, so "incorrect" sounded better and is also used in other error messages in that file.
From 36dca712966093a932d86263629f3a596691b061 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Thu, 23 Feb 2023 08:31:03 +0100
Subject: [PATCH] Make some xlogreader messages more accurate

---
 src/backend/access/transam/xlogreader.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/src/backend/access/transam/xlogreader.c 
b/src/backend/access/transam/xlogreader.c
index aa6c929477..36d711483c 100644
--- a/src/backend/access/transam/xlogreader.c
+++ b/src/backend/access/transam/xlogreader.c
@@ -623,8 +623,9 @@ XLogDecodeNextRecord(XLogReaderState *state, bool 
nonblocking)
        }
        else if (targetRecOff < pageHeaderSize)
        {
-               report_invalid_record(state, "invalid record offset at %X/%X",
-                                                         
LSN_FORMAT_ARGS(RecPtr));
+               report_invalid_record(state, "invalid record offset at %X/%X: 
wanted >=%u, got %u",
+                                                         
LSN_FORMAT_ARGS(RecPtr),
+                                                         pageHeaderSize, 
targetRecOff);
                goto err;
        }
 
@@ -672,7 +673,7 @@ XLogDecodeNextRecord(XLogReaderState *state, bool 
nonblocking)
                if (total_len < SizeOfXLogRecord)
                {
                        report_invalid_record(state,
-                                                                 "invalid 
record length at %X/%X: wanted %u, got %u",
+                                                                 "invalid 
record length at %X/%X: wanted >=%u, got %u",
                                                                  
LSN_FORMAT_ARGS(RecPtr),
                                                                  (uint32) 
SizeOfXLogRecord, total_len);
                        goto err;
@@ -1119,7 +1120,7 @@ ValidXLogRecordHeader(XLogReaderState *state, XLogRecPtr 
RecPtr,
        if (record->xl_tot_len < SizeOfXLogRecord)
        {
                report_invalid_record(state,
-                                                         "invalid record 
length at %X/%X: wanted %u, got %u",
+                                                         "invalid record 
length at %X/%X: wanted >=%u, got %u",
                                                          
LSN_FORMAT_ARGS(RecPtr),
                                                          (uint32) 
SizeOfXLogRecord, record->xl_tot_len);
                return false;
@@ -1942,7 +1943,7 @@ DecodeXLogRecord(XLogReaderState *state,
 
 shortdata_err:
        report_invalid_record(state,
-                                                 "record with invalid length 
at %X/%X",
+                                                 "record with incorrect length 
at %X/%X",
                                                  
LSN_FORMAT_ARGS(state->ReadRecPtr));
 err:
        *errormsg = state->errormsg_buf;
-- 
2.39.2

Reply via email to