Skip to content

Commit f4d9954

Browse files
knizhnikKonstantin Knizhnik
authored andcommitted
Remember last written LSN when it is first requested (#412)
* Remember last written LSN when it is first requested * Use rnode instead of rlocator * Return updated LSN in SetLastWrittenLSN * Remove wrong new line --------- Co-authored-by: Konstantin Knizhnik <[email protected]>
1 parent c4ccf38 commit f4d9954

File tree

2 files changed

+22
-12
lines changed

2 files changed

+22
-12
lines changed

src/backend/access/transam/xlog.c

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9038,6 +9038,11 @@ GetLastWrittenLSN(RelFileNode rnode, ForkNumber forknum, BlockNumber blkno)
90389038
entry = hash_search(lastWrittenLsnCache, &key, HASH_FIND, NULL);
90399039
if (entry != NULL)
90409040
lsn = entry->lsn;
9041+
else
9042+
{
9043+
LWLockRelease(LastWrittenLsnLock);
9044+
return SetLastWrittenLSNForBlock(lsn, rnode, forknum, blkno);
9045+
}
90419046
}
90429047
else
90439048
{
@@ -9065,17 +9070,19 @@ GetLastWrittenLSN(RelFileNode rnode, ForkNumber forknum, BlockNumber blkno)
90659070
* rnode.relNode can be InvalidOid, in this case maxLastWrittenLsn is updated.
90669071
* SetLastWrittenLsn with dummy rnode is used by createdb and dbase_redo functions.
90679072
*/
9068-
void
9073+
XLogRecPtr
90699074
SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode rnode, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks)
90709075
{
90719076
if (lsn == InvalidXLogRecPtr || n_blocks == 0 || lastWrittenLsnCacheSize == 0)
9072-
return;
9077+
return lsn;
90739078

90749079
LWLockAcquire(LastWrittenLsnLock, LW_EXCLUSIVE);
90759080
if (rnode.relNode == InvalidOid)
90769081
{
90779082
if (lsn > XLogCtl->maxLastWrittenLsn)
90789083
XLogCtl->maxLastWrittenLsn = lsn;
9084+
else
9085+
lsn = XLogCtl->maxLastWrittenLsn;
90799086
}
90809087
else
90819088
{
@@ -9094,6 +9101,8 @@ SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode rnode, ForkNumber for
90949101
{
90959102
if (lsn > entry->lsn)
90969103
entry->lsn = lsn;
9104+
else
9105+
lsn = entry->lsn;
90979106
/* Unlink from LRU list */
90989107
dlist_delete(&entry->lru_node);
90999108
}
@@ -9116,34 +9125,35 @@ SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode rnode, ForkNumber for
91169125
}
91179126
}
91189127
LWLockRelease(LastWrittenLsnLock);
9128+
return lsn;
91199129
}
91209130

91219131
/*
91229132
* SetLastWrittenLSNForBlock -- Set maximal LSN for block
91239133
*/
9124-
void
9134+
XLogRecPtr
91259135
SetLastWrittenLSNForBlock(XLogRecPtr lsn, RelFileNode rnode, ForkNumber forknum, BlockNumber blkno)
91269136
{
9127-
SetLastWrittenLSNForBlockRange(lsn, rnode, forknum, blkno, 1);
9137+
return SetLastWrittenLSNForBlockRange(lsn, rnode, forknum, blkno, 1);
91289138
}
91299139

91309140
/*
91319141
* SetLastWrittenLSNForRelation -- Set maximal LSN for relation metadata
91329142
*/
9133-
void
9143+
XLogRecPtr
91349144
SetLastWrittenLSNForRelation(XLogRecPtr lsn, RelFileNode rnode, ForkNumber forknum)
91359145
{
9136-
SetLastWrittenLSNForBlock(lsn, rnode, forknum, REL_METADATA_PSEUDO_BLOCKNO);
9146+
return SetLastWrittenLSNForBlock(lsn, rnode, forknum, REL_METADATA_PSEUDO_BLOCKNO);
91379147
}
91389148

91399149
/*
91409150
* SetLastWrittenLSNForDatabase -- Set maximal LSN for the whole database
91419151
*/
9142-
void
9152+
XLogRecPtr
91439153
SetLastWrittenLSNForDatabase(XLogRecPtr lsn)
91449154
{
91459155
RelFileNode dummyNode = {InvalidOid, InvalidOid, InvalidOid};
9146-
SetLastWrittenLSNForBlock(lsn, dummyNode, MAIN_FORKNUM, 0);
9156+
return SetLastWrittenLSNForBlock(lsn, dummyNode, MAIN_FORKNUM, 0);
91479157
}
91489158

91499159
/*

src/include/access/xlog.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -358,10 +358,10 @@ extern XLogRecPtr GetFlushRecPtr(void);
358358
extern XLogRecPtr GetLastImportantRecPtr(void);
359359
extern void RemovePromoteSignalFiles(void);
360360

361-
extern void SetLastWrittenLSNForBlock(XLogRecPtr lsn, RelFileNode relfilenode, ForkNumber forknum, BlockNumber blkno);
362-
extern void SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode relfilenode, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks);
363-
extern void SetLastWrittenLSNForDatabase(XLogRecPtr lsn);
364-
extern void SetLastWrittenLSNForRelation(XLogRecPtr lsn, RelFileNode relfilenode, ForkNumber forknum);
361+
extern XLogRecPtr SetLastWrittenLSNForBlock(XLogRecPtr lsn, RelFileNode relfilenode, ForkNumber forknum, BlockNumber blkno);
362+
extern XLogRecPtr SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode relfilenode, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks);
363+
extern XLogRecPtr SetLastWrittenLSNForDatabase(XLogRecPtr lsn);
364+
extern XLogRecPtr SetLastWrittenLSNForRelation(XLogRecPtr lsn, RelFileNode relfilenode, ForkNumber forknum);
365365
extern XLogRecPtr GetLastWrittenLSN(RelFileNode relfilenode, ForkNumber forknum, BlockNumber blkno);
366366

367367
extern XLogRecPtr GetRedoStartLsn(void);

0 commit comments

Comments
 (0)