@@ -9038,6 +9038,11 @@ GetLastWrittenLSN(RelFileNode rnode, ForkNumber forknum, BlockNumber blkno)
9038
9038
entry = hash_search (lastWrittenLsnCache , & key , HASH_FIND , NULL );
9039
9039
if (entry != NULL )
9040
9040
lsn = entry -> lsn ;
9041
+ else
9042
+ {
9043
+ LWLockRelease (LastWrittenLsnLock );
9044
+ return SetLastWrittenLSNForBlock (lsn , rnode , forknum , blkno );
9045
+ }
9041
9046
}
9042
9047
else
9043
9048
{
@@ -9065,17 +9070,19 @@ GetLastWrittenLSN(RelFileNode rnode, ForkNumber forknum, BlockNumber blkno)
9065
9070
* rnode.relNode can be InvalidOid, in this case maxLastWrittenLsn is updated.
9066
9071
* SetLastWrittenLsn with dummy rnode is used by createdb and dbase_redo functions.
9067
9072
*/
9068
- void
9073
+ XLogRecPtr
9069
9074
SetLastWrittenLSNForBlockRange (XLogRecPtr lsn , RelFileNode rnode , ForkNumber forknum , BlockNumber from , BlockNumber n_blocks )
9070
9075
{
9071
9076
if (lsn == InvalidXLogRecPtr || n_blocks == 0 || lastWrittenLsnCacheSize == 0 )
9072
- return ;
9077
+ return lsn ;
9073
9078
9074
9079
LWLockAcquire (LastWrittenLsnLock , LW_EXCLUSIVE );
9075
9080
if (rnode .relNode == InvalidOid )
9076
9081
{
9077
9082
if (lsn > XLogCtl -> maxLastWrittenLsn )
9078
9083
XLogCtl -> maxLastWrittenLsn = lsn ;
9084
+ else
9085
+ lsn = XLogCtl -> maxLastWrittenLsn ;
9079
9086
}
9080
9087
else
9081
9088
{
@@ -9094,6 +9101,8 @@ SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode rnode, ForkNumber for
9094
9101
{
9095
9102
if (lsn > entry -> lsn )
9096
9103
entry -> lsn = lsn ;
9104
+ else
9105
+ lsn = entry -> lsn ;
9097
9106
/* Unlink from LRU list */
9098
9107
dlist_delete (& entry -> lru_node );
9099
9108
}
@@ -9116,34 +9125,35 @@ SetLastWrittenLSNForBlockRange(XLogRecPtr lsn, RelFileNode rnode, ForkNumber for
9116
9125
}
9117
9126
}
9118
9127
LWLockRelease (LastWrittenLsnLock );
9128
+ return lsn ;
9119
9129
}
9120
9130
9121
9131
/*
9122
9132
* SetLastWrittenLSNForBlock -- Set maximal LSN for block
9123
9133
*/
9124
- void
9134
+ XLogRecPtr
9125
9135
SetLastWrittenLSNForBlock (XLogRecPtr lsn , RelFileNode rnode , ForkNumber forknum , BlockNumber blkno )
9126
9136
{
9127
- SetLastWrittenLSNForBlockRange (lsn , rnode , forknum , blkno , 1 );
9137
+ return SetLastWrittenLSNForBlockRange (lsn , rnode , forknum , blkno , 1 );
9128
9138
}
9129
9139
9130
9140
/*
9131
9141
* SetLastWrittenLSNForRelation -- Set maximal LSN for relation metadata
9132
9142
*/
9133
- void
9143
+ XLogRecPtr
9134
9144
SetLastWrittenLSNForRelation (XLogRecPtr lsn , RelFileNode rnode , ForkNumber forknum )
9135
9145
{
9136
- SetLastWrittenLSNForBlock (lsn , rnode , forknum , REL_METADATA_PSEUDO_BLOCKNO );
9146
+ return SetLastWrittenLSNForBlock (lsn , rnode , forknum , REL_METADATA_PSEUDO_BLOCKNO );
9137
9147
}
9138
9148
9139
9149
/*
9140
9150
* SetLastWrittenLSNForDatabase -- Set maximal LSN for the whole database
9141
9151
*/
9142
- void
9152
+ XLogRecPtr
9143
9153
SetLastWrittenLSNForDatabase (XLogRecPtr lsn )
9144
9154
{
9145
9155
RelFileNode dummyNode = {InvalidOid , InvalidOid , InvalidOid };
9146
- SetLastWrittenLSNForBlock (lsn , dummyNode , MAIN_FORKNUM , 0 );
9156
+ return SetLastWrittenLSNForBlock (lsn , dummyNode , MAIN_FORKNUM , 0 );
9147
9157
}
9148
9158
9149
9159
/*
0 commit comments