Add LSN location in some error messages related to WAL pages
authorMichael Paquier <[email protected]>
Mon, 5 Dec 2022 00:28:29 +0000 (09:28 +0900)
committerMichael Paquier <[email protected]>
Mon, 5 Dec 2022 00:28:29 +0000 (09:28 +0900)
The error messages reported during any failures while reading or
validating the header of a WAL currently includes only the offset of the
page but not the compiled LSN referring to the page, requiring an extra
step to compile it if looking at the surroundings with pg_waldump or
similar.  Adding this information costs a bit in translation, but also
eases debugging.

Author: Bharath Rupireddy
Reviewed-by: Álvaro Herrera, Kyotaro Horiguchi, Maxim Orlov, Michael
Paquier
Discussion: https://postgr.es/m/CALj2ACWV=FCddsxcGbVOA=cvPyMr75YCFbSQT6g4KDj=gcJK4g@mail.gmail.com

src/backend/access/transam/xlogreader.c
src/backend/access/transam/xlogrecovery.c

index 93f667b2544c60cfca916335073b27a90b54a407..a38a80e049097f5b37e7ed937d72abc4680053c2 100644 (file)
@@ -1226,9 +1226,10 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
                XLogFileName(fname, state->seg.ws_tli, segno, state->segcxt.ws_segsize);
 
                report_invalid_record(state,
-                                                         "invalid magic number %04X in WAL segment %s, offset %u",
+                                                         "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u",
                                                          hdr->xlp_magic,
                                                          fname,
+                                                         LSN_FORMAT_ARGS(recptr),
                                                          offset);
                return false;
        }
@@ -1240,9 +1241,10 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
                XLogFileName(fname, state->seg.ws_tli, segno, state->segcxt.ws_segsize);
 
                report_invalid_record(state,
-                                                         "invalid info bits %04X in WAL segment %s, offset %u",
+                                                         "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u",
                                                          hdr->xlp_info,
                                                          fname,
+                                                         LSN_FORMAT_ARGS(recptr),
                                                          offset);
                return false;
        }
@@ -1281,9 +1283,10 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
 
                /* hmm, first page of file doesn't have a long header? */
                report_invalid_record(state,
-                                                         "invalid info bits %04X in WAL segment %s, offset %u",
+                                                         "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u",
                                                          hdr->xlp_info,
                                                          fname,
+                                                         LSN_FORMAT_ARGS(recptr),
                                                          offset);
                return false;
        }
@@ -1300,9 +1303,10 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
                XLogFileName(fname, state->seg.ws_tli, segno, state->segcxt.ws_segsize);
 
                report_invalid_record(state,
-                                                         "unexpected pageaddr %X/%X in WAL segment %s, offset %u",
+                                                         "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u",
                                                          LSN_FORMAT_ARGS(hdr->xlp_pageaddr),
                                                          fname,
+                                                         LSN_FORMAT_ARGS(recptr),
                                                          offset);
                return false;
        }
@@ -1325,10 +1329,11 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
                        XLogFileName(fname, state->seg.ws_tli, segno, state->segcxt.ws_segsize);
 
                        report_invalid_record(state,
-                                                                 "out-of-sequence timeline ID %u (after %u) in WAL segment %s, offset %u",
+                                                                 "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u",
                                                                  hdr->xlp_tli,
                                                                  state->latestPageTLI,
                                                                  fname,
+                                                                 LSN_FORMAT_ARGS(recptr),
                                                                  offset);
                        return false;
                }
index 41ffc57da9c6a043797d75a44b6f1c3399c4a464..97b882564ff821ca382a8ab80ebf8eedff85a730 100644 (file)
@@ -3075,9 +3075,10 @@ ReadRecord(XLogPrefetcher *xlogprefetcher, int emode,
                        XLogFileName(fname, xlogreader->seg.ws_tli, segno,
                                                 wal_segment_size);
                        ereport(emode_for_corrupt_record(emode, xlogreader->EndRecPtr),
-                                       (errmsg("unexpected timeline ID %u in WAL segment %s, offset %u",
+                                       (errmsg("unexpected timeline ID %u in WAL segment %s, LSN %X/%X, offset %u",
                                                        xlogreader->latestPageTLI,
                                                        fname,
+                                                       LSN_FORMAT_ARGS(xlogreader->latestPagePtr),
                                                        offset)));
                        record = NULL;
                }
@@ -3280,14 +3281,16 @@ retry:
                        errno = save_errno;
                        ereport(emode_for_corrupt_record(emode, targetPagePtr + reqLen),
                                        (errcode_for_file_access(),
-                                        errmsg("could not read from WAL segment %s, offset %u: %m",
-                                                       fname, readOff)));
+                                        errmsg("could not read from WAL segment %s, LSN %X/%X, offset %u: %m",
+                                                       fname, LSN_FORMAT_ARGS(targetPagePtr),
+                                                       readOff)));
                }
                else
                        ereport(emode_for_corrupt_record(emode, targetPagePtr + reqLen),
                                        (errcode(ERRCODE_DATA_CORRUPTED),
-                                        errmsg("could not read from WAL segment %s, offset %u: read %d of %zu",
-                                                       fname, readOff, r, (Size) XLOG_BLCKSZ)));
+                                        errmsg("could not read from WAL segment %s, LSN %X/%X, offset %u: read %d of %zu",
+                                                       fname, LSN_FORMAT_ARGS(targetPagePtr),
+                                                       readOff, r, (Size) XLOG_BLCKSZ)));
                goto next_record_is_invalid;
        }
        pgstat_report_wait_end();