mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Use ExtendBufferedRelTo() in XLogReadBufferExtended()
Instead of extending the relation block-by-block, use ExtendBufferedRelTo(),
introduced in 31966b151e
. This is faster and simpler.
This also somewhat reduces the danger that disconnected segments pose (which
can be "discovered" once the previous segment reaches SEGSIZE), as
ExtendBufferedRelTo() won't extend past the block it has been asked. However,
the risk of the content of such a disconnected segment being invalid
remains.
Discussion: https://postgr.es/m/20221029025420.eplyow6k7tgu6he3@awork3.anarazel.de
Discussion: https://postgr.es/m/20230223010147.32oir7sb66slqnjk@awork3.anarazel.de
This commit is contained in:
@ -524,28 +524,13 @@ XLogReadBufferExtended(RelFileLocator rlocator, ForkNumber forknum,
|
||||
/* OK to extend the file */
|
||||
/* we do this in recovery only - no rel-extension lock needed */
|
||||
Assert(InRecovery);
|
||||
buffer = InvalidBuffer;
|
||||
do
|
||||
{
|
||||
if (buffer != InvalidBuffer)
|
||||
{
|
||||
if (mode == RBM_ZERO_AND_LOCK || mode == RBM_ZERO_AND_CLEANUP_LOCK)
|
||||
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
|
||||
ReleaseBuffer(buffer);
|
||||
}
|
||||
buffer = ReadBufferWithoutRelcache(rlocator, forknum,
|
||||
P_NEW, mode, NULL, true);
|
||||
}
|
||||
while (BufferGetBlockNumber(buffer) < blkno);
|
||||
/* Handle the corner case that P_NEW returns non-consecutive pages */
|
||||
if (BufferGetBlockNumber(buffer) != blkno)
|
||||
{
|
||||
if (mode == RBM_ZERO_AND_LOCK || mode == RBM_ZERO_AND_CLEANUP_LOCK)
|
||||
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
|
||||
ReleaseBuffer(buffer);
|
||||
buffer = ReadBufferWithoutRelcache(rlocator, forknum, blkno,
|
||||
mode, NULL, true);
|
||||
}
|
||||
buffer = ExtendBufferedRelTo(EB_SMGR(smgr, RELPERSISTENCE_PERMANENT),
|
||||
forknum,
|
||||
NULL,
|
||||
EB_PERFORMING_RECOVERY |
|
||||
EB_SKIP_EXTENSION_LOCK,
|
||||
blkno + 1,
|
||||
mode);
|
||||
}
|
||||
|
||||
recent_buffer_fast_path:
|
||||
|
Reference in New Issue
Block a user