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