Adjust assertion in XLogDecodeNextRecord.
authorRobert Haas <rhaas@postgresql.org>
Thu, 18 Aug 2022 16:15:55 +0000 (12:15 -0400)
committerRobert Haas <rhaas@postgresql.org>
Thu, 18 Aug 2022 16:22:20 +0000 (12:22 -0400)
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

src/backend/access/transam/xlogreader.c

index 06e91547dd39d7e1650611fd2677219f5ddbc92a..f17e80948d17ff0e2e92fd1677d1a0da06778fc7 100644 (file)
@@ -576,10 +576,11 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking)
        /*
         * Caller supplied a position to start at.
         *
-        * In this case, NextRecPtr should already be pointing to a valid
-        * record starting position.
+        * In this case, NextRecPtr should already be pointing either to a
+        * 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;
    }