On Fri, Aug 12, 2022 at 6:33 PM Robert Haas <robertmh...@gmail.com> wrote: > > On Thu, Aug 11, 2022 at 2:15 PM Robert Haas <robertmh...@gmail.com> wrote: > > As far as I know, this 0001 addresses all outstanding comments and > > fixes the reported bug. > > > > Does anyone think otherwise? > > If they do, they're keeping quiet, so I committed this and > back-patched it to v15. > > Regarding 0002 -- should it, perhaps, use PGAlignedBlock?
Yes we can do that, although here we are not using this buffer directly as a "Page" so we do not have any real alignment issue but I do not see any problem in using PGAlignedBlock so change that. > Although 0002 is formally a performance optimization, I'm inclined to > think that if we're going to commit it, it should also be back-patched > into v15, because letting the code diverge when we're not even out of > beta yet seems painful. Yeah that makes sense to me. -- Regards, Dilip Kumar EnterpriseDB: http://www.enterprisedb.com
From 59fadefe04f8f2eeb6bc5e2e02efde56d5ace8aa Mon Sep 17 00:00:00 2001 From: Dilip Kumar <dilip.ku...@enterprisedb.com> Date: Fri, 5 Aug 2022 11:25:23 +0530 Subject: [PATCH v4] Optimize copy storage from source to destination Instead of extending block at a time directly bulkextend the destination relation and then just perform the block level copy. --- src/backend/storage/buffer/bufmgr.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 9c1bd50..7a1202c 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -3712,6 +3712,7 @@ RelationCopyStorageUsingBuffer(RelFileLocator srclocator, bool use_wal; BlockNumber nblocks; BlockNumber blkno; + PGAlignedBlock buf; BufferAccessStrategy bstrategy_src; BufferAccessStrategy bstrategy_dst; @@ -3730,6 +3731,14 @@ RelationCopyStorageUsingBuffer(RelFileLocator srclocator, if (nblocks == 0) return; + /* + * Bulk extend the destination relation of the same size as the source + * relation before starting to copy block by block. + */ + memset(buf.data, 0, BLCKSZ); + smgrextend(smgropen(dstlocator, InvalidBackendId), forkNum, nblocks - 1, + buf.data, true); + /* This is a bulk operation, so use buffer access strategies. */ bstrategy_src = GetAccessStrategy(BAS_BULKREAD); bstrategy_dst = GetAccessStrategy(BAS_BULKWRITE); @@ -3747,7 +3756,7 @@ RelationCopyStorageUsingBuffer(RelFileLocator srclocator, srcPage = BufferGetPage(srcBuf); /* Use P_NEW to extend the destination relation. */ - dstBuf = ReadBufferWithoutRelcache(dstlocator, forkNum, P_NEW, + dstBuf = ReadBufferWithoutRelcache(dstlocator, forkNum, blkno, RBM_NORMAL, bstrategy_dst, permanent); LockBuffer(dstBuf, BUFFER_LOCK_EXCLUSIVE); -- 1.8.3.1