@@ -6747,52 +6747,59 @@ GetLastWrittenLSNv(RelFileLocator relfilenode, ForkNumber forknum,
6747
6747
Assert (nblocks > 0 );
6748
6748
Assert (PointerIsValid (lsns ));
6749
6749
6750
- LWLockAcquire (LastWrittenLsnLock , LW_SHARED );
6751
-
6752
6750
if (relfilenode .relNumber != InvalidOid )
6753
6751
{
6754
6752
BufferTag key ;
6753
+ XLogRecPtr max_lsn ;
6754
+
6755
6755
key .spcOid = relfilenode .spcOid ;
6756
6756
key .dbOid = relfilenode .dbOid ;
6757
6757
key .relNumber = relfilenode .relNumber ;
6758
6758
key .forkNum = forknum ;
6759
6759
6760
+ LWLockAcquire (LastWrittenLsnLock , LW_SHARED );
6761
+
6760
6762
for (int i = 0 ; i < nblocks ; i ++ )
6761
6763
{
6762
6764
/* Maximal last written LSN among all non-cached pages */
6763
6765
key .blockNum = blkno + i ;
6764
6766
6765
6767
entry = hash_search (lastWrittenLsnCache , & key , HASH_FIND , NULL );
6766
6768
6767
- if (entry != NULL )
6768
- lsns [i ] = entry -> lsn ;
6769
- else
6770
- {
6771
- XLogRecPtr lsn ;
6772
- lsns [i ] = lsn = XLogCtl -> maxLastWrittenLsn ;
6769
+ lsns [i ] = (entry != NULL ) ? entry -> lsn : InvalidXLogRecPtr ;
6770
+ }
6771
+ max_lsn = XLogCtl -> maxLastWrittenLsn ;
6773
6772
6774
- LWLockRelease (LastWrittenLsnLock );
6775
- SetLastWrittenLSNForBlock (lsn , relfilenode , forknum , key .blockNum );
6776
- LWLockAcquire (LastWrittenLsnLock , LW_SHARED );
6773
+ LWLockRelease (LastWrittenLsnLock );
6774
+
6775
+ for (int i = 0 ; i < nblocks ; i ++ )
6776
+ {
6777
+ if (lsns [i ] == InvalidXLogRecPtr )
6778
+ {
6779
+ lsns [i ] = max_lsn ;
6780
+ SetLastWrittenLSNForBlock (max_lsn , relfilenode , forknum , key .blockNum );
6777
6781
}
6778
6782
}
6779
6783
}
6780
6784
else
6781
6785
{
6782
6786
HASH_SEQ_STATUS seq ;
6783
6787
XLogRecPtr lsn = XLogCtl -> maxLastWrittenLsn ;
6788
+
6789
+ LWLockAcquire (LastWrittenLsnLock , LW_SHARED );
6790
+
6784
6791
/* Find maximum of all cached LSNs */
6785
6792
hash_seq_init (& seq , lastWrittenLsnCache );
6786
6793
while ((entry = (LastWrittenLsnCacheEntry * ) hash_seq_search (& seq )) != NULL )
6787
6794
{
6788
6795
if (entry -> lsn > lsn )
6789
6796
lsn = entry -> lsn ;
6790
6797
}
6798
+ LWLockRelease (LastWrittenLsnLock );
6791
6799
6792
6800
for (int i = 0 ; i < nblocks ; i ++ )
6793
6801
lsns [i ] = lsn ;
6794
6802
}
6795
- LWLockRelease (LastWrittenLsnLock );
6796
6803
}
6797
6804
6798
6805
/*
0 commit comments