@@ -84,6 +84,11 @@ static char *hexdump_page(char *page);
84
84
85
85
const int SmgrTrace = DEBUG5 ;
86
86
87
+ /*
88
+ * Pseudo block number used to associate LSN with relation metadata (relation size)
89
+ */
90
+ #define REL_METADATA_PSEUDO_BLOCKNO InvalidBlockNumber
91
+
87
92
page_server_api * page_server ;
88
93
89
94
/* GUCs */
@@ -558,7 +563,7 @@ zenith_wallog_page(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum,
558
563
* Remember the LSN on this page. When we read the page again, we must
559
564
* read the same or newer version of it.
560
565
*/
561
- SetLastWrittenPageLSN (lsn );
566
+ SetLastWrittenLSN (lsn , reln -> smgr_rnode . node . relNode , blocknum , blocknum );
562
567
}
563
568
564
569
@@ -603,7 +608,7 @@ zm_adjust_lsn(XLogRecPtr lsn)
603
608
* Return LSN for requesting pages and number of blocks from page server
604
609
*/
605
610
static XLogRecPtr
606
- zenith_get_request_lsn (bool * latest )
611
+ zenith_get_request_lsn (bool * latest , Oid rnode , BlockNumber blkno )
607
612
{
608
613
XLogRecPtr lsn ;
609
614
@@ -630,9 +635,9 @@ zenith_get_request_lsn(bool *latest)
630
635
* so our request cannot concern those.
631
636
*/
632
637
* latest = true;
633
- lsn = GetLastWrittenPageLSN ( );
638
+ lsn = GetLastWrittenLSN ( rnode , blkno );
634
639
Assert (lsn != InvalidXLogRecPtr );
635
- elog (DEBUG1 , "zenith_get_request_lsn GetLastWrittenPageLSN lsn %X/%X " ,
640
+ elog (DEBUG1 , "zenith_get_request_lsn GetLastWrittenLSN lsn %X/%X " ,
636
641
(uint32 ) ((lsn ) >> 32 ), (uint32 ) (lsn ));
637
642
638
643
lsn = zm_adjust_lsn (lsn );
@@ -716,7 +721,7 @@ zenith_exists(SMgrRelation reln, ForkNumber forkNum)
716
721
return false;
717
722
}
718
723
719
- request_lsn = zenith_get_request_lsn (& latest );
724
+ request_lsn = zenith_get_request_lsn (& latest , reln -> smgr_rnode . node . relNode , REL_METADATA_PSEUDO_BLOCKNO );
720
725
{
721
726
ZenithExistsRequest request = {
722
727
.req .tag = T_ZenithExistsRequest ,
@@ -791,7 +796,7 @@ zenith_create(SMgrRelation reln, ForkNumber forkNum, bool isRedo)
791
796
*
792
797
* FIXME: This is currently not just an optimization, but required for
793
798
* correctness. Postgres can call smgrnblocks() on the newly-created
794
- * relation. Currently, we don't call SetLastWrittenPageLSN () when a new
799
+ * relation. Currently, we don't call SetLastWrittenLSN () when a new
795
800
* relation created, so if we didn't remember the size in the relsize
796
801
* cache, we might call smgrnblocks() on the newly-created relation before
797
802
* the creation WAL record hass been received by the page server.
@@ -904,6 +909,8 @@ zenith_extend(SMgrRelation reln, ForkNumber forkNum, BlockNumber blkno,
904
909
if (IS_LOCAL_REL (reln ))
905
910
mdextend (reln , forkNum , blkno , buffer , skipFsync );
906
911
#endif
912
+
913
+ SetLastWrittenLSN (lsn , reln -> smgr_rnode .node .relNode , REL_METADATA_PSEUDO_BLOCKNO , REL_METADATA_PSEUDO_BLOCKNO );
907
914
}
908
915
909
916
/*
@@ -1079,7 +1086,7 @@ zenith_read(SMgrRelation reln, ForkNumber forkNum, BlockNumber blkno,
1079
1086
elog (ERROR , "unknown relpersistence '%c'" , reln -> smgr_relpersistence );
1080
1087
}
1081
1088
1082
- request_lsn = zenith_get_request_lsn (& latest );
1089
+ request_lsn = zenith_get_request_lsn (& latest , reln -> smgr_rnode . node . relNode , blkno );
1083
1090
zenith_read_at_lsn (reln -> smgr_rnode .node , forkNum , blkno , request_lsn , latest , buffer );
1084
1091
1085
1092
#ifdef DEBUG_COMPARE_LOCAL
@@ -1284,7 +1291,7 @@ zenith_nblocks(SMgrRelation reln, ForkNumber forknum)
1284
1291
return n_blocks ;
1285
1292
}
1286
1293
1287
- request_lsn = zenith_get_request_lsn (& latest );
1294
+ request_lsn = zenith_get_request_lsn (& latest , reln -> smgr_rnode . node . relNode , REL_METADATA_PSEUDO_BLOCKNO );
1288
1295
{
1289
1296
ZenithNblocksRequest request = {
1290
1297
.req .tag = T_ZenithNblocksRequest ,
@@ -1344,7 +1351,7 @@ zenith_dbsize(Oid dbNode)
1344
1351
XLogRecPtr request_lsn ;
1345
1352
bool latest ;
1346
1353
1347
- request_lsn = zenith_get_request_lsn (& latest );
1354
+ request_lsn = zenith_get_request_lsn (& latest , InvalidOid , REL_METADATA_PSEUDO_BLOCKNO );
1348
1355
{
1349
1356
ZenithDbSizeRequest request = {
1350
1357
.req .tag = T_ZenithDbSizeRequest ,
@@ -1431,7 +1438,11 @@ zenith_truncate(SMgrRelation reln, ForkNumber forknum, BlockNumber nblocks)
1431
1438
*/
1432
1439
XLogFlush (lsn );
1433
1440
1434
- SetLastWrittenPageLSN (lsn );
1441
+ /*
1442
+ * Truncate may affect several chunks of relations. So we should either update last written LSN for all of them,
1443
+ * either update LSN for "dummy" metadata block. Second approach seems to be more efficient.
1444
+ */
1445
+ SetLastWrittenLSN (lsn , reln -> smgr_rnode .node .relNode , REL_METADATA_PSEUDO_BLOCKNO , REL_METADATA_PSEUDO_BLOCKNO );
1435
1446
1436
1447
#ifdef DEBUG_COMPARE_LOCAL
1437
1448
if (IS_LOCAL_REL (reln ))
0 commit comments