@@ -6281,6 +6281,11 @@ GetLastWrittenLSN(RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno
6281
6281
entry = hash_search (lastWrittenLsnCache , & key , HASH_FIND , NULL );
6282
6282
if (entry != NULL )
6283
6283
lsn = entry -> lsn ;
6284
+ else
6285
+ {
6286
+ LWLockRelease (LastWrittenLsnLock );
6287
+ return SetLastWrittenLSNForBlock (lsn , rlocator , forknum , blkno );
6288
+ }
6284
6289
}
6285
6290
else
6286
6291
{
@@ -6308,17 +6313,19 @@ GetLastWrittenLSN(RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno
6308
6313
* rlocator.relNumber can be InvalidOid, in this case maxLastWrittenLsn is updated.
6309
6314
* SetLastWrittenLsn with dummy rlocator is used by createdb and dbase_redo functions.
6310
6315
*/
6311
- void
6316
+ XLogRecPtr
6312
6317
SetLastWrittenLSNForBlockRange (XLogRecPtr lsn , RelFileLocator rlocator , ForkNumber forknum , BlockNumber from , BlockNumber n_blocks )
6313
6318
{
6314
6319
if (lsn == InvalidXLogRecPtr || n_blocks == 0 || lastWrittenLsnCacheSize == 0 )
6315
- return ;
6320
+ return lsn ;
6316
6321
6317
6322
LWLockAcquire (LastWrittenLsnLock , LW_EXCLUSIVE );
6318
6323
if (rlocator .relNumber == InvalidOid )
6319
6324
{
6320
6325
if (lsn > XLogCtl -> maxLastWrittenLsn )
6321
6326
XLogCtl -> maxLastWrittenLsn = lsn ;
6327
+ else
6328
+ lsn = XLogCtl -> maxLastWrittenLsn ;
6322
6329
}
6323
6330
else
6324
6331
{
@@ -6339,6 +6346,8 @@ SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumb
6339
6346
{
6340
6347
if (lsn > entry -> lsn )
6341
6348
entry -> lsn = lsn ;
6349
+ else
6350
+ lsn = entry -> lsn ;
6342
6351
/* Unlink from LRU list */
6343
6352
dlist_delete (& entry -> lru_node );
6344
6353
}
@@ -6361,34 +6370,35 @@ SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileLocator rlocator, ForkNumb
6361
6370
}
6362
6371
}
6363
6372
LWLockRelease (LastWrittenLsnLock );
6373
+ return lsn ;
6364
6374
}
6365
6375
6366
6376
/*
6367
6377
* SetLastWrittenLSNForBlock -- Set maximal LSN for block
6368
6378
*/
6369
- void
6379
+ XLogRecPtr
6370
6380
SetLastWrittenLSNForBlock (XLogRecPtr lsn , RelFileLocator rlocator , ForkNumber forknum , BlockNumber blkno )
6371
6381
{
6372
- SetLastWrittenLSNForBlockRange (lsn , rlocator , forknum , blkno , 1 );
6382
+ return SetLastWrittenLSNForBlockRange (lsn , rlocator , forknum , blkno , 1 );
6373
6383
}
6374
6384
6375
6385
/*
6376
6386
* SetLastWrittenLSNForRelation -- Set maximal LSN for relation metadata
6377
6387
*/
6378
- void
6388
+ XLogRecPtr
6379
6389
SetLastWrittenLSNForRelation (XLogRecPtr lsn , RelFileLocator rlocator , ForkNumber forknum )
6380
6390
{
6381
- SetLastWrittenLSNForBlock (lsn , rlocator , forknum , REL_METADATA_PSEUDO_BLOCKNO );
6391
+ return SetLastWrittenLSNForBlock (lsn , rlocator , forknum , REL_METADATA_PSEUDO_BLOCKNO );
6382
6392
}
6383
6393
6384
6394
/*
6385
6395
* SetLastWrittenLSNForDatabase -- Set maximal LSN for the whole database
6386
6396
*/
6387
- void
6397
+ XLogRecPtr
6388
6398
SetLastWrittenLSNForDatabase (XLogRecPtr lsn )
6389
6399
{
6390
6400
RelFileLocator dummyNode = {InvalidOid , InvalidOid , InvalidOid };
6391
- SetLastWrittenLSNForBlock (lsn , dummyNode , MAIN_FORKNUM , 0 );
6401
+ return SetLastWrittenLSNForBlock (lsn , dummyNode , MAIN_FORKNUM , 0 );
6392
6402
}
6393
6403
6394
6404
void
0 commit comments