Skip to content

Commit ff1f94a

Browse files
knizhnikMMeent
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 05791d8 commit ff1f94a

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
@@ -8973,17 +8973,18 @@ GetLastWrittenLSN(Oid rnode, BlockNumber blkno)
89738973
}
89748974

89758975
/*
8976-
* SetLastWrittenLSN -- Set maximal LSN of written page.
8976+
* SetLastWrittenLSNForBlockRange -- Set maximal LSN of written page range.
89778977
* We maintain cache of last written LSNs with limited size and LRU replacement
89788978
* policy. To reduce cache size we store max LSN not for each page, but for
89798979
* bucket (1024 blocks). This cache allows to use old LSN when
89808980
* requesting pages of unchanged or appended relations.
89818981
*
8982-
* rnode can be InvalidOid, in this case maxLastWrittenLsn is updated. SetLastWrittensn with InvalidOid
8982+
* rnode can be InvalidOid, in this case maxLastWrittenLsn is updated.
8983+
* SetLastWrittenLsn with InvalidOid
89838984
* is used by createdb and dbase_redo functions.
89848985
*/
89858986
void
8986-
SetLastWrittenLSN(XLogRecPtr lsn, Oid rnode, BlockNumber from, BlockNumber till)
8987+
SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, Oid rnode, BlockNumber from, BlockNumber till)
89878988
{
89888989
if (lsn == InvalidXLogRecPtr)
89898990
return;
@@ -9041,6 +9042,33 @@ SetLastWrittenLSN(XLogRecPtr lsn, Oid rnode, BlockNumber from, BlockNumber till)
90419042
LWLockRelease(LastWrittenLsnLock);
90429043
}
90439044

9045+
/*
9046+
* SetLastWrittenLSNForBlock -- Set maximal LSN for block
9047+
*/
9048+
void
9049+
SetLastWrittenLSNForBlock(XLogRecPtr lsn, Oid rnode, BlockNumber blkno)
9050+
{
9051+
SetLastWrittenLSNForBlockRange(lsn, rnode, blkno, blkno);
9052+
}
9053+
9054+
/*
9055+
* SetLastWrittenLSNForRelation -- Set maximal LSN for relation metadata
9056+
*/
9057+
void
9058+
SetLastWrittenLSNForRelation(XLogRecPtr lsn, Oid rnode)
9059+
{
9060+
SetLastWrittenLSNForBlock(lsn, rnode, REL_METADATA_PSEUDO_BLOCKNO);
9061+
}
9062+
9063+
/*
9064+
* SetLastWrittenLSNForDatabase -- Set maximal LSN for the whole database
9065+
*/
9066+
void
9067+
SetLastWrittenLSNForDatabase(XLogRecPtr lsn)
9068+
{
9069+
SetLastWrittenLSNForBlock(lsn, InvalidOid, 0);
9070+
}
9071+
90449072
/*
90459073
* RedoStartLsn is set only once by startup process, locking is not required
90469074
* 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)