Skip to content

Commit 71cb84e

Browse files
committed
Add LSN location in some error messages related to WAL pages
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
1 parent 8692f66 commit 71cb84e

File tree

2 files changed

+18
-10
lines changed

2 files changed

+18
-10
lines changed

src/backend/access/transam/xlogreader.c

+10-5
Original file line numberDiff line numberDiff line change
@@ -1226,9 +1226,10 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
12261226
XLogFileName(fname, state->seg.ws_tli, segno, state->segcxt.ws_segsize);
12271227

12281228
report_invalid_record(state,
1229-
"invalid magic number %04X in WAL segment %s, offset %u",
1229+
"invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u",
12301230
hdr->xlp_magic,
12311231
fname,
1232+
LSN_FORMAT_ARGS(recptr),
12321233
offset);
12331234
return false;
12341235
}
@@ -1240,9 +1241,10 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
12401241
XLogFileName(fname, state->seg.ws_tli, segno, state->segcxt.ws_segsize);
12411242

12421243
report_invalid_record(state,
1243-
"invalid info bits %04X in WAL segment %s, offset %u",
1244+
"invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u",
12441245
hdr->xlp_info,
12451246
fname,
1247+
LSN_FORMAT_ARGS(recptr),
12461248
offset);
12471249
return false;
12481250
}
@@ -1281,9 +1283,10 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
12811283

12821284
/* hmm, first page of file doesn't have a long header? */
12831285
report_invalid_record(state,
1284-
"invalid info bits %04X in WAL segment %s, offset %u",
1286+
"invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u",
12851287
hdr->xlp_info,
12861288
fname,
1289+
LSN_FORMAT_ARGS(recptr),
12871290
offset);
12881291
return false;
12891292
}
@@ -1300,9 +1303,10 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
13001303
XLogFileName(fname, state->seg.ws_tli, segno, state->segcxt.ws_segsize);
13011304

13021305
report_invalid_record(state,
1303-
"unexpected pageaddr %X/%X in WAL segment %s, offset %u",
1306+
"unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u",
13041307
LSN_FORMAT_ARGS(hdr->xlp_pageaddr),
13051308
fname,
1309+
LSN_FORMAT_ARGS(recptr),
13061310
offset);
13071311
return false;
13081312
}
@@ -1325,10 +1329,11 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
13251329
XLogFileName(fname, state->seg.ws_tli, segno, state->segcxt.ws_segsize);
13261330

13271331
report_invalid_record(state,
1328-
"out-of-sequence timeline ID %u (after %u) in WAL segment %s, offset %u",
1332+
"out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u",
13291333
hdr->xlp_tli,
13301334
state->latestPageTLI,
13311335
fname,
1336+
LSN_FORMAT_ARGS(recptr),
13321337
offset);
13331338
return false;
13341339
}

src/backend/access/transam/xlogrecovery.c

+8-5
Original file line numberDiff line numberDiff line change
@@ -3075,9 +3075,10 @@ ReadRecord(XLogPrefetcher *xlogprefetcher, int emode,
30753075
XLogFileName(fname, xlogreader->seg.ws_tli, segno,
30763076
wal_segment_size);
30773077
ereport(emode_for_corrupt_record(emode, xlogreader->EndRecPtr),
3078-
(errmsg("unexpected timeline ID %u in WAL segment %s, offset %u",
3078+
(errmsg("unexpected timeline ID %u in WAL segment %s, LSN %X/%X, offset %u",
30793079
xlogreader->latestPageTLI,
30803080
fname,
3081+
LSN_FORMAT_ARGS(xlogreader->latestPagePtr),
30813082
offset)));
30823083
record = NULL;
30833084
}
@@ -3280,14 +3281,16 @@ XLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, int reqLen,
32803281
errno = save_errno;
32813282
ereport(emode_for_corrupt_record(emode, targetPagePtr + reqLen),
32823283
(errcode_for_file_access(),
3283-
errmsg("could not read from WAL segment %s, offset %u: %m",
3284-
fname, readOff)));
3284+
errmsg("could not read from WAL segment %s, LSN %X/%X, offset %u: %m",
3285+
fname, LSN_FORMAT_ARGS(targetPagePtr),
3286+
readOff)));
32853287
}
32863288
else
32873289
ereport(emode_for_corrupt_record(emode, targetPagePtr + reqLen),
32883290
(errcode(ERRCODE_DATA_CORRUPTED),
3289-
errmsg("could not read from WAL segment %s, offset %u: read %d of %zu",
3290-
fname, readOff, r, (Size) XLOG_BLCKSZ)));
3291+
errmsg("could not read from WAL segment %s, LSN %X/%X, offset %u: read %d of %zu",
3292+
fname, LSN_FORMAT_ARGS(targetPagePtr),
3293+
readOff, r, (Size) XLOG_BLCKSZ)));
32913294
goto next_record_is_invalid;
32923295
}
32933296
pgstat_report_wait_end();

0 commit comments

Comments
 (0)