From 84ea96a3a517986711102bf162b39d506c85cdb1 Mon Sep 17 00:00:00 2001 From: MMeent Date: Wed, 27 Sep 2023 15:15:41 +0200 Subject: [PATCH] Use single WAL record for 0-extension of relations Bulk materialization of empty pages at logging of new last relation block is handled in the Pageserver already, so no need for us to log those pages. --- pgxn/neon/pagestore_smgr.c | 40 ++++++++++++-------------------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/pgxn/neon/pagestore_smgr.c b/pgxn/neon/pagestore_smgr.c index 2e4364cbfa..8593cb8ed3 100644 --- a/pgxn/neon/pagestore_smgr.c +++ b/pgxn/neon/pagestore_smgr.c @@ -1790,39 +1790,23 @@ neon_zeroextend(SMgrRelation reln, ForkNumber forkNum, BlockNumber blocknum, if (!XLogInsertAllowed()) return; - /* ensure we have enough xlog buffers to log max-sized records */ - XLogEnsureRecordSpace(Min(remblocks, (XLR_MAX_BLOCK_ID - 1)), 0); - /* - * Iterate over all the pages. They are collected into batches of - * XLR_MAX_BLOCK_ID pages, and a single WAL-record is written for each - * batch. + * Pageserver auto-extends relations with 0s, so WAL-logging only the last + * page is enough here (else we'd log each page 2 times with 0-bytes. */ - while (remblocks > 0) - { - int count = Min(remblocks, XLR_MAX_BLOCK_ID); - - XLogBeginInsert(); - - for (int i = 0; i < count; i++) - XLogRegisterBlock(i, &InfoFromSMgrRel(reln), forkNum, blocknum + i, - (char *) buffer.data, REGBUF_FORCE_IMAGE | REGBUF_STANDARD); - - lsn = XLogInsert(RM_XLOG_ID, XLOG_FPI); - - for (int i = 0; i < count; i++) - { - lfc_write(InfoFromSMgrRel(reln), forkNum, blocknum + i, buffer.data); - SetLastWrittenLSNForBlock(lsn, InfoFromSMgrRel(reln), forkNum, - blocknum + i); - } - - blocknum += count; - remblocks -= count; - } + XLogBeginInsert(); + XLogRegisterBlock(0, &InfoFromSMgrRel(reln), forkNum, blocknum + nblocks, (char *) &buffer.data, REGBUF_FORCE_IMAGE); + lsn = XLogInsert(RM_XLOG_ID, XLOG_FPI); Assert(lsn != 0); + for (uint32 i = blocknum; i < blocknum + nblocks; i++) + { + lfc_write(InfoFromSMgrRel(reln), forkNum, blocknum + i, buffer.data); + SetLastWrittenLSNForBlock(lsn, InfoFromSMgrRel(reln), forkNum, + blocknum + i); + } + SetLastWrittenLSNForRelation(lsn, InfoFromSMgrRel(reln), forkNum); set_cached_relsize(InfoFromSMgrRel(reln), forkNum, blocknum); }