Compare commits

...

2 Commits

Author SHA1 Message Date
MMeent
a24d0f6cd1 Update pagestore_smgr.c
Fix a potential self-race where WAL isn't flushed before the changes are requested from PS, resulting in stalls.
2023-09-27 17:47:35 +02:00
MMeent
84ea96a3a5 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.
2023-09-27 15:15:41 +02:00

View File

@@ -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);
}
@@ -1985,6 +1969,14 @@ neon_read_at_lsn(NRelFileInfo rinfo, ForkNumber forkNum, BlockNumber blkno,
if (RecoveryInProgress() && !(MyBackendType == B_STARTUP))
XLogWaitForReplayOf(request_lsn);
/*
* It is possible that previous modifications in this backend haven't been
* flushed yet (e.g. in neon_zeroextend), so we do so right now to make sure
* future reads don't have to wait forever.
*/
if (!RecoveryInProgress())
XLogFlush(request_lsn);
/*
* Try to find prefetched page in the list of received pages.
*/