Skip to content

Commit abe69cf

Browse files
hlinnakahs-liuxh
authored andcommitted
Don't reset 'latest_page_number' when replaying multixid truncation
'latest_page_number' is set to the correct value, according to nextOffset, early at system startup. Contrary to the comment, it hence should be set up correctly by the time we get to WAL replay. This fixes a failure to replay WAL generated on older minor versions, before commit 789d65364c (18.2, 17.8, 16.12, 15.16, 14.21). The failure occurs after a truncation record has been replayed and looks like this: FATAL: could not access status of transaction 858112 DETAIL: Could not read from file "pg_multixact/offsets/000D" at offset 24576: read too few bytes. CONTEXT: WAL redo at 3/2A3AB408 for MultiXact/CREATE_ID: 858111 offset 6695072 nmembers 5: 1048228 (sh) 1048271 (keysh) 1048316 (sh) 1048344 (keysh) 1048370 (sh) Reported-by: Sebastian Webber <sebastian@swebber.me> Reviewed-by: Andrey Borodin <x4mmm@yandex-team.ru> Reviewed-by: Kirill Reshke <reshkekirill@gmail.com> Discussion: https://www.postgresql.org/message-id/20260214090150.GC2297@p46.dedyn.io;lightning.p46.dedyn.io Backpatch-through: 14-18
1 parent ca1e069 commit abe69cf

2 files changed

Lines changed: 3 additions & 10 deletions

File tree

src/backend/access/transam/multixact.c

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3438,7 +3438,6 @@ multixact_redo(XLogReaderState *record)
34383438
else if (info == XLOG_MULTIXACT_TRUNCATE_ID)
34393439
{
34403440
xl_multixact_truncate xlrec;
3441-
int pageno;
34423441

34433442
memcpy(&xlrec, XLogRecGetData(record),
34443443
SizeOfMultiXactTruncate);
@@ -3463,14 +3462,6 @@ multixact_redo(XLogReaderState *record)
34633462
SetMultiXactIdLimit(xlrec.endTruncOff, xlrec.oldestMultiDB, false);
34643463

34653464
PerformMembersTruncation(xlrec.startTruncMemb, xlrec.endTruncMemb);
3466-
3467-
/*
3468-
* During XLOG replay, latest_page_number isn't necessarily set up
3469-
* yet; insert a suitable value to bypass the sanity test in
3470-
* SimpleLruTruncate.
3471-
*/
3472-
pageno = MultiXactIdToOffsetPage(xlrec.endTruncOff);
3473-
MultiXactOffsetCtl->shared->latest_page_number = pageno;
34743465
PerformOffsetsTruncation(xlrec.startTruncOff, xlrec.endTruncOff);
34753466

34763467
LWLockRelease(MultiXactTruncationLock);

src/include/access/slru.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,9 @@ typedef struct SlruSharedData
9393
/*
9494
* latest_page_number is the page number of the current end of the log;
9595
* this is not critical data, since we use it only to avoid swapping out
96-
* the latest page.
96+
* the latest page. (An exception: an accurate latest_page_number is
97+
* needed on pg_multixact/offsets to replay WAL generated with older minor
98+
* versions correctly. See RecordNewMultiXact().)
9799
*/
98100
int latest_page_number;
99101

0 commit comments

Comments
 (0)