@@ -6133,6 +6133,11 @@ GetLastWrittenLSN(RelFileNode rnode, ForkNumber forknum, BlockNumber blkno)
6133
6133
entry = hash_search (lastWrittenLsnCache , & key , HASH_FIND , NULL );
6134
6134
if (entry != NULL )
6135
6135
lsn = entry -> lsn ;
6136
+ else
6137
+ {
6138
+ LWLockRelease (LastWrittenLsnLock );
6139
+ return SetLastWrittenLSNForBlock (lsn , rnode , forknum , blkno );
6140
+ }
6136
6141
}
6137
6142
else
6138
6143
{
@@ -6160,17 +6165,19 @@ GetLastWrittenLSN(RelFileNode rnode, ForkNumber forknum, BlockNumber blkno)
6160
6165
* rnode.relNode can be InvalidOid, in this case maxLastWrittenLsn is updated.
6161
6166
* SetLastWrittenLsn with dummy rnode is used by createdb and dbase_redo functions.
6162
6167
*/
6163
- void
6168
+ XLogRecPtr
6164
6169
SetLastWrittenLSNForBlockRange (XLogRecPtr lsn , RelFileNode rnode , ForkNumber forknum , BlockNumber from , BlockNumber n_blocks )
6165
6170
{
6166
6171
if (lsn == InvalidXLogRecPtr || n_blocks == 0 || lastWrittenLsnCacheSize == 0 )
6167
- return ;
6172
+ return lsn ;
6168
6173
6169
6174
LWLockAcquire (LastWrittenLsnLock , LW_EXCLUSIVE );
6170
6175
if (rnode .relNode == InvalidOid )
6171
6176
{
6172
6177
if (lsn > XLogCtl -> maxLastWrittenLsn )
6173
6178
XLogCtl -> maxLastWrittenLsn = lsn ;
6179
+ else
6180
+ lsn = XLogCtl -> maxLastWrittenLsn ;
6174
6181
}
6175
6182
else
6176
6183
{
@@ -6189,6 +6196,8 @@ SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode rnode, ForkNumber for
6189
6196
{
6190
6197
if (lsn > entry -> lsn )
6191
6198
entry -> lsn = lsn ;
6199
+ else
6200
+ lsn = entry -> lsn ;
6192
6201
/* Unlink from LRU list */
6193
6202
dlist_delete (& entry -> lru_node );
6194
6203
}
@@ -6211,34 +6220,35 @@ SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode rnode, ForkNumber for
6211
6220
}
6212
6221
}
6213
6222
LWLockRelease (LastWrittenLsnLock );
6223
+ return lsn ;
6214
6224
}
6215
6225
6216
6226
/*
6217
6227
* SetLastWrittenLSNForBlock -- Set maximal LSN for block
6218
6228
*/
6219
- void
6229
+ XLogRecPtr
6220
6230
SetLastWrittenLSNForBlock (XLogRecPtr lsn , RelFileNode rnode , ForkNumber forknum , BlockNumber blkno )
6221
6231
{
6222
- SetLastWrittenLSNForBlockRange (lsn , rnode , forknum , blkno , 1 );
6232
+ return SetLastWrittenLSNForBlockRange (lsn , rnode , forknum , blkno , 1 );
6223
6233
}
6224
6234
6225
6235
/*
6226
6236
* SetLastWrittenLSNForRelation -- Set maximal LSN for relation metadata
6227
6237
*/
6228
- void
6238
+ XLogRecPtr
6229
6239
SetLastWrittenLSNForRelation (XLogRecPtr lsn , RelFileNode rnode , ForkNumber forknum )
6230
6240
{
6231
- SetLastWrittenLSNForBlock (lsn , rnode , forknum , REL_METADATA_PSEUDO_BLOCKNO );
6241
+ return SetLastWrittenLSNForBlock (lsn , rnode , forknum , REL_METADATA_PSEUDO_BLOCKNO );
6232
6242
}
6233
6243
6234
6244
/*
6235
6245
* SetLastWrittenLSNForDatabase -- Set maximal LSN for the whole database
6236
6246
*/
6237
- void
6247
+ XLogRecPtr
6238
6248
SetLastWrittenLSNForDatabase (XLogRecPtr lsn )
6239
6249
{
6240
6250
RelFileNode dummyNode = {InvalidOid , InvalidOid , InvalidOid };
6241
- SetLastWrittenLSNForBlock (lsn , dummyNode , MAIN_FORKNUM , 0 );
6251
+ return SetLastWrittenLSNForBlock (lsn , dummyNode , MAIN_FORKNUM , 0 );
6242
6252
}
6243
6253
6244
6254
void
0 commit comments