Skip to content

Commit dedaf88

Browse files
knizhnikKonstantin Knizhnik
authored andcommitted
Remember last written LSN when it is first requested (#411)
* 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 555dd21 commit dedaf88

File tree

2 files changed

+22
-12
lines changed

2 files changed

+22
-12
lines changed

src/backend/access/transam/xlog.c

+18-8
Original file line numberDiff line numberDiff line change
@@ -6133,6 +6133,11 @@ GetLastWrittenLSN(RelFileNode rnode, ForkNumber forknum, BlockNumber blkno)
61336133
entry = hash_search(lastWrittenLsnCache, &key, HASH_FIND, NULL);
61346134
if (entry != NULL)
61356135
lsn = entry->lsn;
6136+
else
6137+
{
6138+
LWLockRelease(LastWrittenLsnLock);
6139+
return SetLastWrittenLSNForBlock(lsn, rnode, forknum, blkno);
6140+
}
61366141
}
61376142
else
61386143
{
@@ -6160,17 +6165,19 @@ GetLastWrittenLSN(RelFileNode rnode, ForkNumber forknum, BlockNumber blkno)
61606165
* rnode.relNode can be InvalidOid, in this case maxLastWrittenLsn is updated.
61616166
* SetLastWrittenLsn with dummy rnode is used by createdb and dbase_redo functions.
61626167
*/
6163-
void
6168+
XLogRecPtr
61646169
SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode rnode, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks)
61656170
{
61666171
if (lsn == InvalidXLogRecPtr || n_blocks == 0 || lastWrittenLsnCacheSize == 0)
6167-
return;
6172+
return lsn;
61686173

61696174
LWLockAcquire(LastWrittenLsnLock, LW_EXCLUSIVE);
61706175
if (rnode.relNode == InvalidOid)
61716176
{
61726177
if (lsn > XLogCtl->maxLastWrittenLsn)
61736178
XLogCtl->maxLastWrittenLsn = lsn;
6179+
else
6180+
lsn = XLogCtl->maxLastWrittenLsn;
61746181
}
61756182
else
61766183
{
@@ -6189,6 +6196,8 @@ SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode rnode, ForkNumber for
61896196
{
61906197
if (lsn > entry->lsn)
61916198
entry->lsn = lsn;
6199+
else
6200+
lsn = entry->lsn;
61926201
/* Unlink from LRU list */
61936202
dlist_delete(&entry->lru_node);
61946203
}
@@ -6211,34 +6220,35 @@ SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode rnode, ForkNumber for
62116220
}
62126221
}
62136222
LWLockRelease(LastWrittenLsnLock);
6223+
return lsn;
62146224
}
62156225

62166226
/*
62176227
* SetLastWrittenLSNForBlock -- Set maximal LSN for block
62186228
*/
6219-
void
6229+
XLogRecPtr
62206230
SetLastWrittenLSNForBlock(XLogRecPtr lsn, RelFileNode rnode, ForkNumber forknum, BlockNumber blkno)
62216231
{
6222-
SetLastWrittenLSNForBlockRange(lsn, rnode, forknum, blkno, 1);
6232+
return SetLastWrittenLSNForBlockRange(lsn, rnode, forknum, blkno, 1);
62236233
}
62246234

62256235
/*
62266236
* SetLastWrittenLSNForRelation -- Set maximal LSN for relation metadata
62276237
*/
6228-
void
6238+
XLogRecPtr
62296239
SetLastWrittenLSNForRelation(XLogRecPtr lsn, RelFileNode rnode, ForkNumber forknum)
62306240
{
6231-
SetLastWrittenLSNForBlock(lsn, rnode, forknum, REL_METADATA_PSEUDO_BLOCKNO);
6241+
return SetLastWrittenLSNForBlock(lsn, rnode, forknum, REL_METADATA_PSEUDO_BLOCKNO);
62326242
}
62336243

62346244
/*
62356245
* SetLastWrittenLSNForDatabase -- Set maximal LSN for the whole database
62366246
*/
6237-
void
6247+
XLogRecPtr
62386248
SetLastWrittenLSNForDatabase(XLogRecPtr lsn)
62396249
{
62406250
RelFileNode dummyNode = {InvalidOid, InvalidOid, InvalidOid};
6241-
SetLastWrittenLSNForBlock(lsn, dummyNode, MAIN_FORKNUM, 0);
6251+
return SetLastWrittenLSNForBlock(lsn, dummyNode, MAIN_FORKNUM, 0);
62426252
}
62436253

62446254
void

src/include/access/xlog.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -256,10 +256,10 @@ extern XLogRecPtr GetLastImportantRecPtr(void);
256256

257257
/* neon specifics */
258258

259-
extern void SetLastWrittenLSNForBlock(XLogRecPtr lsn, RelFileNode relfilenode, ForkNumber forknum, BlockNumber blkno);
260-
extern void SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode relfilenode, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks);
261-
extern void SetLastWrittenLSNForDatabase(XLogRecPtr lsn);
262-
extern void SetLastWrittenLSNForRelation(XLogRecPtr lsn, RelFileNode relfilenode, ForkNumber forknum);
259+
extern XLogRecPtr SetLastWrittenLSNForBlock(XLogRecPtr lsn, RelFileNode relfilenode, ForkNumber forknum, BlockNumber blkno);
260+
extern XLogRecPtr SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode relfilenode, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks);
261+
extern XLogRecPtr SetLastWrittenLSNForDatabase(XLogRecPtr lsn);
262+
extern XLogRecPtr SetLastWrittenLSNForRelation(XLogRecPtr lsn, RelFileNode relfilenode, ForkNumber forknum);
263263
extern XLogRecPtr GetLastWrittenLSN(RelFileNode relfilenode, ForkNumber forknum, BlockNumber blkno);
264264

265265
extern void SetRedoStartLsn(XLogRecPtr RedoStartLSN);

0 commit comments

Comments
 (0)