diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index ee70340d7a6d4781442a8783094c2f68d78bf305..99414d98bc4f8c0560b6093d8d001a679872a7e1 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -337,15 +337,21 @@ XLogReadBufferExtended(RelFileNode rnode, ForkNumber forknum, /* we do this in recovery only - no rel-extension lock needed */ Assert(InRecovery); buffer = InvalidBuffer; - while (blkno >= lastblock) + do { if (buffer != InvalidBuffer) ReleaseBuffer(buffer); buffer = ReadBufferWithoutRelcache(rnode, forknum, P_NEW, mode, NULL); - lastblock++; } - Assert(BufferGetBlockNumber(buffer) == blkno); + while (BufferGetBlockNumber(buffer) < blkno); + /* Handle the corner case that P_NEW returns non-consecutive pages */ + if (BufferGetBlockNumber(buffer) != blkno) + { + ReleaseBuffer(buffer); + buffer = ReadBufferWithoutRelcache(rnode, forknum, blkno, + mode, NULL); + } } if (mode == RBM_NORMAL)