Skip to content

Commit b092941

Browse files
knizhniklubennikovaav
authored andcommitted
Update last written LSN for gin/gist index metadata (#182)
* Update last written LSN for gin/gist index metadata * Replace SetLastWrittenLSN with family of SetLastWrittenLSNFFor* functions
1 parent 118847d commit b092941

File tree

7 files changed

+54
-20
lines changed

7 files changed

+54
-20
lines changed

contrib/neon/pagestore_smgr.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,6 @@ static char *hexdump_page(char *page);
8484

8585
const int SmgrTrace = DEBUG5;
8686

87-
/*
88-
* Pseudo block number used to associate LSN with relation metadata (relation size)
89-
*/
90-
#define REL_METADATA_PSEUDO_BLOCKNO InvalidBlockNumber
91-
9287
page_server_api *page_server;
9388

9489
/* GUCs */
@@ -563,7 +558,7 @@ zenith_wallog_page(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum,
563558
* Remember the LSN on this page. When we read the page again, we must
564559
* read the same or newer version of it.
565560
*/
566-
SetLastWrittenLSN(lsn, reln->smgr_rnode.node.relNode, blocknum, blocknum);
561+
SetLastWrittenLSNForBlock(lsn, reln->smgr_rnode.node.relNode, blocknum);
567562
}
568563

569564

@@ -910,7 +905,7 @@ zenith_extend(SMgrRelation reln, ForkNumber forkNum, BlockNumber blkno,
910905
mdextend(reln, forkNum, blkno, buffer, skipFsync);
911906
#endif
912907

913-
SetLastWrittenLSN(lsn, reln->smgr_rnode.node.relNode, REL_METADATA_PSEUDO_BLOCKNO, REL_METADATA_PSEUDO_BLOCKNO);
908+
SetLastWrittenLSNForRelation(lsn, reln->smgr_rnode.node.relNode);
914909
}
915910

916911
/*
@@ -1442,7 +1437,7 @@ zenith_truncate(SMgrRelation reln, ForkNumber forknum, BlockNumber nblocks)
14421437
* Truncate may affect several chunks of relations. So we should either update last written LSN for all of them,
14431438
* either update LSN for "dummy" metadata block. Second approach seems to be more efficient.
14441439
*/
1445-
SetLastWrittenLSN(lsn, reln->smgr_rnode.node.relNode, REL_METADATA_PSEUDO_BLOCKNO, REL_METADATA_PSEUDO_BLOCKNO);
1440+
SetLastWrittenLSNForRelation(lsn, reln->smgr_rnode.node.relNode);
14461441

14471442
#ifdef DEBUG_COMPARE_LOCAL
14481443
if (IS_LOCAL_REL(reln))

src/backend/access/gin/gininsert.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,8 @@ ginbuild(Relation heap, Relation index, IndexInfo *indexInfo)
421421
log_newpage_range(index, MAIN_FORKNUM,
422422
0, RelationGetNumberOfBlocks(index),
423423
true);
424-
SetLastWrittenLSN(XactLastRecEnd, index->rd_smgr->smgr_rnode.node.relNode, 0, RelationGetNumberOfBlocks(index));
424+
SetLastWrittenLSNForBlockRange(XactLastRecEnd, index->rd_smgr->smgr_rnode.node.relNode, 0, RelationGetNumberOfBlocks(index));
425+
SetLastWrittenLSNForRelation(XactLastRecEnd, index->rd_smgr->smgr_rnode.node.relNode);
425426
}
426427

427428
smgr_end_unlogged_build(index->rd_smgr);

src/backend/access/gist/gistbuild.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -335,9 +335,10 @@ gistbuild(Relation heap, Relation index, IndexInfo *indexInfo)
335335
log_newpage_range(index, MAIN_FORKNUM,
336336
0, RelationGetNumberOfBlocks(index),
337337
true);
338-
SetLastWrittenLSN(XactLastRecEnd,
338+
SetLastWrittenLSNForBlockRange(XactLastRecEnd,
339339
index->rd_smgr->smgr_rnode.node.relNode,
340340
0, RelationGetNumberOfBlocks(index));
341+
SetLastWrittenLSNForRelation(XactLastRecEnd, index->rd_smgr->smgr_rnode.node.relNode);
341342
}
342343
smgr_end_unlogged_build(index->rd_smgr);
343344
}
@@ -470,8 +471,9 @@ gist_indexsortbuild(GISTBuildState *state)
470471

471472
lsn = log_newpage(&state->indexrel->rd_node, MAIN_FORKNUM, GIST_ROOT_BLKNO,
472473
pagestate->page, true);
473-
SetLastWrittenLSN(lsn, state->indexrel->rd_smgr->smgr_rnode.node.relNode,
474-
GIST_ROOT_BLKNO, GIST_ROOT_BLKNO);
474+
SetLastWrittenLSNForBlock(lsn, state->indexrel->rd_smgr->smgr_rnode.node.relNode,
475+
GIST_ROOT_BLKNO);
476+
SetLastWrittenLSNForRelation(lsn, state->indexrel->rd_smgr->smgr_rnode.node.relNode);
475477
}
476478

477479
pfree(pagestate->page);

src/backend/access/spgist/spginsert.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,9 @@ spgbuild(Relation heap, Relation index, IndexInfo *indexInfo)
143143
log_newpage_range(index, MAIN_FORKNUM,
144144
0, RelationGetNumberOfBlocks(index),
145145
true);
146-
SetLastWrittenLSN(XactLastRecEnd, index->rd_smgr->smgr_rnode.node.relNode,
146+
SetLastWrittenLSNForBlockRange(XactLastRecEnd, index->rd_smgr->smgr_rnode.node.relNode,
147147
0, RelationGetNumberOfBlocks(index));
148+
SetLastWrittenLSNForRelation(XactLastRecEnd, index->rd_smgr->smgr_rnode.node.relNode);
148149
}
149150

150151
smgr_end_unlogged_build(index->rd_smgr);

src/backend/access/transam/xlog.c

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8987,17 +8987,18 @@ GetLastWrittenLSN(Oid rnode, BlockNumber blkno)
89878987
}
89888988

89898989
/*
8990-
* SetLastWrittenLSN -- Set maximal LSN of written page.
8990+
* SetLastWrittenLSNForBlockRange -- Set maximal LSN of written page range.
89918991
* We maintain cache of last written LSNs with limited size and LRU replacement
89928992
* policy. To reduce cache size we store max LSN not for each page, but for
89938993
* bucket (1024 blocks). This cache allows to use old LSN when
89948994
* requesting pages of unchanged or appended relations.
89958995
*
8996-
* rnode can be InvalidOid, in this case maxLastWrittenLsn is updated. SetLastWrittensn with InvalidOid
8996+
* rnode can be InvalidOid, in this case maxLastWrittenLsn is updated.
8997+
* SetLastWrittenLsn with InvalidOid
89978998
* is used by createdb and dbase_redo functions.
89988999
*/
89999000
void
9000-
SetLastWrittenLSN(XLogRecPtr lsn, Oid rnode, BlockNumber from, BlockNumber till)
9001+
SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, Oid rnode, BlockNumber from, BlockNumber till)
90019002
{
90029003
if (lsn == InvalidXLogRecPtr)
90039004
return;
@@ -9055,6 +9056,33 @@ SetLastWrittenLSN(XLogRecPtr lsn, Oid rnode, BlockNumber from, BlockNumber till)
90559056
LWLockRelease(LastWrittenLsnLock);
90569057
}
90579058

9059+
/*
9060+
* SetLastWrittenLSNForBlock -- Set maximal LSN for block
9061+
*/
9062+
void
9063+
SetLastWrittenLSNForBlock(XLogRecPtr lsn, Oid rnode, BlockNumber blkno)
9064+
{
9065+
SetLastWrittenLSNForBlockRange(lsn, rnode, blkno, blkno);
9066+
}
9067+
9068+
/*
9069+
* SetLastWrittenLSNForRelation -- Set maximal LSN for relation metadata
9070+
*/
9071+
void
9072+
SetLastWrittenLSNForRelation(XLogRecPtr lsn, Oid rnode)
9073+
{
9074+
SetLastWrittenLSNForBlock(lsn, rnode, REL_METADATA_PSEUDO_BLOCKNO);
9075+
}
9076+
9077+
/*
9078+
* SetLastWrittenLSNForDatabase -- Set maximal LSN for the whole database
9079+
*/
9080+
void
9081+
SetLastWrittenLSNForDatabase(XLogRecPtr lsn)
9082+
{
9083+
SetLastWrittenLSNForBlock(lsn, InvalidOid, 0);
9084+
}
9085+
90589086
/*
90599087
* RedoStartLsn is set only once by startup process, locking is not required
90609088
* after its exit.

src/backend/commands/dbcommands.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -675,7 +675,7 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt)
675675

676676
lsn = XLogInsert(RM_DBASE_ID,
677677
XLOG_DBASE_CREATE | XLR_SPECIAL_REL_UPDATE);
678-
SetLastWrittenLSN(lsn, InvalidOid, 0, 0);
678+
SetLastWrittenLSNForDatabase(lsn);
679679
}
680680
}
681681
table_endscan(scan);
@@ -2293,8 +2293,7 @@ dbase_redo(XLogReaderState *record)
22932293
*/
22942294
{
22952295
XLogRecPtr lsn = record->EndRecPtr;
2296-
2297-
SetLastWrittenLSN(lsn, InvalidOid, 0, 0);
2296+
SetLastWrittenLSNForDatabase(lsn);
22982297
}
22992298
}
23002299
else if (info == XLOG_DBASE_DROP)

src/include/access/xlog.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ extern int sync_method;
3131

3232
extern PGDLLIMPORT TimeLineID ThisTimeLineID; /* current TLI */
3333

34+
/*
35+
* Pseudo block number used to associate LSN with relation metadata (relation size)
36+
*/
37+
#define REL_METADATA_PSEUDO_BLOCKNO InvalidBlockNumber
38+
3439
/*
3540
* Prior to 8.4, all activity during recovery was carried out by the startup
3641
* process. This local variable continues to be used in many parts of the
@@ -352,7 +357,10 @@ extern XLogRecPtr GetFlushRecPtr(void);
352357
extern XLogRecPtr GetLastImportantRecPtr(void);
353358
extern void RemovePromoteSignalFiles(void);
354359

355-
extern void SetLastWrittenLSN(XLogRecPtr lsn, Oid relfilenode, BlockNumber from, BlockNumber till);
360+
extern void SetLastWrittenLSNForBlock(XLogRecPtr lsn, Oid relfilenode, BlockNumber blkno);
361+
extern void SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, Oid relfilenode, BlockNumber from, BlockNumber till);
362+
extern void SetLastWrittenLSNForDatabase(XLogRecPtr lsn);
363+
extern void SetLastWrittenLSNForRelation(XLogRecPtr lsn, Oid relfilenode);
356364
extern XLogRecPtr GetLastWrittenLSN(Oid relfilenode, BlockNumber blkno);
357365

358366
extern XLogRecPtr GetRedoStartLsn(void);

0 commit comments

Comments
 (0)