Adjust assertion in XLogDecodeNextRecord.

As written, if you use XLogBeginRead() to position an xlogreader at
the beginning of a WAL page and then try to read WAL, this assertion
will fail. However, the header comment for XLogBeginRead() claims
that positioning an xlogreader at the beginning of a page is valid,
and the code here is perfectly able to cope with it. It's only the
assertion that causes trouble. So relax it.

This is formally a bug in all supported branches, but as it doesn't
seem to have any consequences for current uses of the xlogreader
facility, no back-patch, at least for now.

Dilip Kumar and Robert Haas

Discussion: http://postgr.es/m/CA+TgmoaJSs2_7WHW2GzFYe9+zfPtxBKvT3GW47+x=ptUE=cULw@mail.gmail.com
This commit is contained in:
Robert Haas 2022-08-18 12:15:55 -04:00
parent e6dbb48487
commit ec97db399f
1 changed files with 4 additions and 3 deletions

View File

@ -576,10 +576,11 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking)
/* /*
* Caller supplied a position to start at. * Caller supplied a position to start at.
* *
* In this case, NextRecPtr should already be pointing to a valid * In this case, NextRecPtr should already be pointing either to a
* record starting position. * valid record starting position or alternatively to the beginning of
* a page. See the header comments for XLogBeginRead.
*/ */
Assert(XRecOffIsValid(RecPtr)); Assert(RecPtr % XLOG_BLCKSZ == 0 || XRecOffIsValid(RecPtr));
randAccess = true; randAccess = true;
} }