Skip to content

Commit 7517d1c

Browse files
authored
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 db67809 commit 7517d1c

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
@@ -8920,17 +8920,18 @@ GetLastWrittenLSN(Oid rnode, BlockNumber blkno)
89208920
}
89218921

89228922
/*
8923-
* SetLastWrittenLSN -- Set maximal LSN of written page.
8923+
* SetLastWrittenLSNForBlockRange -- Set maximal LSN of written page range.
89248924
* We maintain cache of last written LSNs with limited size and LRU replacement
89258925
* policy. To reduce cache size we store max LSN not for each page, but for
89268926
* bucket (1024 blocks). This cache allows to use old LSN when
89278927
* requesting pages of unchanged or appended relations.
89288928
*
8929-
* rnode can be InvalidOid, in this case maxLastWrittenLsn is updated. SetLastWrittensn with InvalidOid
8929+
* rnode can be InvalidOid, in this case maxLastWrittenLsn is updated.
8930+
* SetLastWrittenLsn with InvalidOid
89308931
* is used by createdb and dbase_redo functions.
89318932
*/
89328933
void
8933-
SetLastWrittenLSN(XLogRecPtr lsn, Oid rnode, BlockNumber from, BlockNumber till)
8934+
SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, Oid rnode, BlockNumber from, BlockNumber till)
89348935
{
89358936
if (lsn == InvalidXLogRecPtr)
89368937
return;
@@ -8988,6 +8989,33 @@ SetLastWrittenLSN(XLogRecPtr lsn, Oid rnode, BlockNumber from, BlockNumber till)
89888989
LWLockRelease(LastWrittenLsnLock);
89898990
}
89908991

8992+
/*
8993+
* SetLastWrittenLSNForBlock -- Set maximal LSN for block
8994+
*/
8995+
void
8996+
SetLastWrittenLSNForBlock(XLogRecPtr lsn, Oid rnode, BlockNumber blkno)
8997+
{
8998+
SetLastWrittenLSNForBlockRange(lsn, rnode, blkno, blkno);
8999+
}
9000+
9001+
/*
9002+
* SetLastWrittenLSNForRelation -- Set maximal LSN for relation metadata
9003+
*/
9004+
void
9005+
SetLastWrittenLSNForRelation(XLogRecPtr lsn, Oid rnode)
9006+
{
9007+
SetLastWrittenLSNForBlock(lsn, rnode, REL_METADATA_PSEUDO_BLOCKNO);
9008+
}
9009+
9010+
/*
9011+
* SetLastWrittenLSNForDatabase -- Set maximal LSN for the whole database
9012+
*/
9013+
void
9014+
SetLastWrittenLSNForDatabase(XLogRecPtr lsn)
9015+
{
9016+
SetLastWrittenLSNForBlock(lsn, InvalidOid, 0);
9017+
}
9018+
89919019
/*
89929020
* RedoStartLsn is set only once by startup process, locking is not required
89939021
* after its exit.

src/backend/commands/dbcommands.c

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

675675
lsn = XLogInsert(RM_DBASE_ID,
676676
XLOG_DBASE_CREATE | XLR_SPECIAL_REL_UPDATE);
677-
SetLastWrittenLSN(lsn, InvalidOid, 0, 0);
677+
SetLastWrittenLSNForDatabase(lsn);
678678
}
679679
}
680680
table_endscan(scan);
@@ -2224,8 +2224,7 @@ dbase_redo(XLogReaderState *record)
22242224
*/
22252225
{
22262226
XLogRecPtr lsn = record->EndRecPtr;
2227-
2228-
SetLastWrittenLSN(lsn, InvalidOid, 0, 0);
2227+
SetLastWrittenLSNForDatabase(lsn);
22292228
}
22302229
}
22312230
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)