Skip to content

Commit ff37527

Browse files
committed
Merge with main
1 parent 08920b4 commit ff37527

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

pgxn/neon/pagestore_smgr.c

+15-8
Original file line numberDiff line numberDiff line change
@@ -630,9 +630,9 @@ zenith_get_request_lsn(bool *latest, RelFileNode rnode, ForkNumber forknum, Bloc
630630
* so our request cannot concern those.
631631
*/
632632
*latest = true;
633-
lsn = GetLastWrittenPageLSN();
633+
lsn = GetLastWrittenLSN(rnode, forknum, blkno);
634634
Assert(lsn != InvalidXLogRecPtr);
635-
elog(DEBUG1, "zenith_get_request_lsn GetLastWrittenPageLSN lsn %X/%X ",
635+
elog(DEBUG1, "zenith_get_request_lsn GetLastWrittenLSN lsn %X/%X ",
636636
(uint32) ((lsn) >> 32), (uint32) (lsn));
637637

638638
lsn = zm_adjust_lsn(lsn);
@@ -716,7 +716,7 @@ zenith_exists(SMgrRelation reln, ForkNumber forkNum)
716716
return false;
717717
}
718718

719-
request_lsn = zenith_get_request_lsn(&latest);
719+
request_lsn = zenith_get_request_lsn(&latest, reln->smgr_rnode.node, forkNum, REL_METADATA_PSEUDO_BLOCKNO);
720720
{
721721
ZenithExistsRequest request = {
722722
.req.tag = T_ZenithExistsRequest,
@@ -791,7 +791,7 @@ zenith_create(SMgrRelation reln, ForkNumber forkNum, bool isRedo)
791791
*
792792
* FIXME: This is currently not just an optimization, but required for
793793
* correctness. Postgres can call smgrnblocks() on the newly-created
794-
* relation. Currently, we don't call SetLastWrittenPageLSN() when a new
794+
* relation. Currently, we don't call SetLastWrittenLSN() when a new
795795
* relation created, so if we didn't remember the size in the relsize
796796
* cache, we might call smgrnblocks() on the newly-created relation before
797797
* the creation WAL record hass been received by the page server.
@@ -904,6 +904,8 @@ zenith_extend(SMgrRelation reln, ForkNumber forkNum, BlockNumber blkno,
904904
if (IS_LOCAL_REL(reln))
905905
mdextend(reln, forkNum, blkno, buffer, skipFsync);
906906
#endif
907+
908+
SetLastWrittenLSNForRelation(lsn, reln->smgr_rnode.node, forkNum);
907909
}
908910

909911
/*
@@ -1079,7 +1081,7 @@ zenith_read(SMgrRelation reln, ForkNumber forkNum, BlockNumber blkno,
10791081
elog(ERROR, "unknown relpersistence '%c'", reln->smgr_relpersistence);
10801082
}
10811083

1082-
request_lsn = zenith_get_request_lsn(&latest);
1084+
request_lsn = zenith_get_request_lsn(&latest, reln->smgr_rnode.node, forkNum, blkno);
10831085
zenith_read_at_lsn(reln->smgr_rnode.node, forkNum, blkno, request_lsn, latest, buffer);
10841086

10851087
#ifdef DEBUG_COMPARE_LOCAL
@@ -1284,7 +1286,7 @@ zenith_nblocks(SMgrRelation reln, ForkNumber forknum)
12841286
return n_blocks;
12851287
}
12861288

1287-
request_lsn = zenith_get_request_lsn(&latest);
1289+
request_lsn = zenith_get_request_lsn(&latest, reln->smgr_rnode.node, forknum, REL_METADATA_PSEUDO_BLOCKNO);
12881290
{
12891291
ZenithNblocksRequest request = {
12901292
.req.tag = T_ZenithNblocksRequest,
@@ -1343,8 +1345,9 @@ zenith_dbsize(Oid dbNode)
13431345
int64 db_size;
13441346
XLogRecPtr request_lsn;
13451347
bool latest;
1348+
RelFileNode dummy_node = {InvalidOid, InvalidOid, InvalidOid};
13461349

1347-
request_lsn = zenith_get_request_lsn(&latest);
1350+
request_lsn = zenith_get_request_lsn(&latest, dummy_node, MAIN_FORKNUM, REL_METADATA_PSEUDO_BLOCKNO);
13481351
{
13491352
ZenithDbSizeRequest request = {
13501353
.req.tag = T_ZenithDbSizeRequest,
@@ -1431,7 +1434,11 @@ zenith_truncate(SMgrRelation reln, ForkNumber forknum, BlockNumber nblocks)
14311434
*/
14321435
XLogFlush(lsn);
14331436

1434-
SetLastWrittenPageLSN(lsn);
1437+
/*
1438+
* Truncate may affect several chunks of relations. So we should either update last written LSN for all of them,
1439+
* either update LSN for "dummy" metadata block. Second approach seems to be more efficient.
1440+
*/
1441+
SetLastWrittenLSNForRelation(lsn, reln->smgr_rnode.node, forknum);
14351442

14361443
#ifdef DEBUG_COMPARE_LOCAL
14371444
if (IS_LOCAL_REL(reln))

0 commit comments

Comments
 (0)