Use ExtendBufferedRelTo() in XLogReadBufferExtended()
authorAndres Freund <[email protected]>
Fri, 7 Apr 2023 00:45:42 +0000 (17:45 -0700)
committerAndres Freund <[email protected]>
Fri, 7 Apr 2023 00:56:17 +0000 (17:56 -0700)
Instead of extending the relation block-by-block, use ExtendBufferedRelTo(),
introduced in 31966b151e6. 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[email protected]
Discussion: https://postgr.es/m/20230223010147[email protected]

src/backend/access/transam/xlogutils.c

index 2c28956b1aafc84ef3ca92e0c90ea4b4f91d28bf..e174a2a8919b78babd7fa8f431b514724d9d547c 100644 (file)
@@ -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: