Skip to content

Commit 082d3b9

Browse files
knizhnikKonstantin Knizhnik
authored andcommitted
Remember last written LSN when it is first requested (#410)
* Remember last written LSN when it is first requested * Return updated LSN in SetLastWrittenLSN --------- Co-authored-by: Konstantin Knizhnik <knizhnik@neon.tech>
1 parent e49bbaa commit 082d3b9

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
@@ -6281,6 +6281,11 @@ GetLastWrittenLSN(RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno
62816281
entry = hash_search(lastWrittenLsnCache, &key, HASH_FIND, NULL);
62826282
if (entry != NULL)
62836283
lsn = entry->lsn;
6284+
else
6285+
{
6286+
LWLockRelease(LastWrittenLsnLock);
6287+
return SetLastWrittenLSNForBlock(lsn, rlocator, forknum, blkno);
6288+
}
62846289
}
62856290
else
62866291
{
@@ -6308,17 +6313,19 @@ GetLastWrittenLSN(RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno
63086313
* rlocator.relNumber can be InvalidOid, in this case maxLastWrittenLsn is updated.
63096314
* SetLastWrittenLsn with dummy rlocator is used by createdb and dbase_redo functions.
63106315
*/
6311-
void
6316+
XLogRecPtr
63126317
SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks)
63136318
{
63146319
if (lsn == InvalidXLogRecPtr || n_blocks == 0 || lastWrittenLsnCacheSize == 0)
6315-
return;
6320+
return lsn;
63166321

63176322
LWLockAcquire(LastWrittenLsnLock, LW_EXCLUSIVE);
63186323
if (rlocator.relNumber == InvalidOid)
63196324
{
63206325
if (lsn > XLogCtl->maxLastWrittenLsn)
63216326
XLogCtl->maxLastWrittenLsn = lsn;
6327+
else
6328+
lsn = XLogCtl->maxLastWrittenLsn;
63226329
}
63236330
else
63246331
{
@@ -6339,6 +6346,8 @@ SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumb
63396346
{
63406347
if (lsn > entry->lsn)
63416348
entry->lsn = lsn;
6349+
else
6350+
lsn = entry->lsn;
63426351
/* Unlink from LRU list */
63436352
dlist_delete(&entry->lru_node);
63446353
}
@@ -6361,34 +6370,35 @@ SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumb
63616370
}
63626371
}
63636372
LWLockRelease(LastWrittenLsnLock);
6373+
return lsn;
63646374
}
63656375

63666376
/*
63676377
* SetLastWrittenLSNForBlock -- Set maximal LSN for block
63686378
*/
6369-
void
6379+
XLogRecPtr
63706380
SetLastWrittenLSNForBlock(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno)
63716381
{
6372-
SetLastWrittenLSNForBlockRange(lsn, rlocator, forknum, blkno, 1);
6382+
return SetLastWrittenLSNForBlockRange(lsn, rlocator, forknum, blkno, 1);
63736383
}
63746384

63756385
/*
63766386
* SetLastWrittenLSNForRelation -- Set maximal LSN for relation metadata
63776387
*/
6378-
void
6388+
XLogRecPtr
63796389
SetLastWrittenLSNForRelation(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumber forknum)
63806390
{
6381-
SetLastWrittenLSNForBlock(lsn, rlocator, forknum, REL_METADATA_PSEUDO_BLOCKNO);
6391+
return SetLastWrittenLSNForBlock(lsn, rlocator, forknum, REL_METADATA_PSEUDO_BLOCKNO);
63826392
}
63836393

63846394
/*
63856395
* SetLastWrittenLSNForDatabase -- Set maximal LSN for the whole database
63866396
*/
6387-
void
6397+
XLogRecPtr
63886398
SetLastWrittenLSNForDatabase(XLogRecPtr lsn)
63896399
{
63906400
RelFileLocator dummyNode = {InvalidOid, InvalidOid, InvalidOid};
6391-
SetLastWrittenLSNForBlock(lsn, dummyNode, MAIN_FORKNUM, 0);
6401+
return SetLastWrittenLSNForBlock(lsn, dummyNode, MAIN_FORKNUM, 0);
63926402
}
63936403

63946404
void

src/include/access/xlog.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -261,10 +261,10 @@ extern XLogRecPtr GetLastImportantRecPtr(void);
261261

262262
/* neon specifics */
263263

264-
extern void SetLastWrittenLSNForBlock(XLogRecPtr lsn, RelFileLocator relfilenode, ForkNumber forknum, BlockNumber blkno);
265-
extern void SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileLocator relfilenode, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks);
266-
extern void SetLastWrittenLSNForDatabase(XLogRecPtr lsn);
267-
extern void SetLastWrittenLSNForRelation(XLogRecPtr lsn, RelFileLocator relfilenode, ForkNumber forknum);
264+
extern XLogRecPtr SetLastWrittenLSNForBlock(XLogRecPtr lsn, RelFileLocator relfilenode, ForkNumber forknum, BlockNumber blkno);
265+
extern XLogRecPtr SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileLocator relfilenode, ForkNumber forknum, BlockNumber from, BlockNumber n_blocks);
266+
extern XLogRecPtr SetLastWrittenLSNForDatabase(XLogRecPtr lsn);
267+
extern XLogRecPtr SetLastWrittenLSNForRelation(XLogRecPtr lsn, RelFileLocator relfilenode, ForkNumber forknum);
268268
extern XLogRecPtr GetLastWrittenLSN(RelFileLocator relfilenode, ForkNumber forknum, BlockNumber blkno);
269269

270270
extern void SetRedoStartLsn(XLogRecPtr RedoStartLSN);

0 commit comments

Comments
 (0)