@@ -6711,6 +6711,8 @@ GetLastWrittenLSN(RelFileLocator rlocator, ForkNumber forknum, BlockNumber blkno
6711
6711
lsn = entry -> lsn ;
6712
6712
else
6713
6713
{
6714
+ LWLockRelease (LastWrittenLsnLock );
6715
+ LWLockAcquire (LastWrittenLsnLock , LW_EXCLUSIVE );
6714
6716
/*
6715
6717
* In case of statements CREATE TABLE AS SELECT... or INSERT FROM SELECT... we are fetching data from source table
6716
6718
* and storing it in destination table. It cause problems with prefetch last-written-lsn is known for the pages of
@@ -6764,6 +6766,7 @@ GetLastWrittenLSNv(RelFileLocator relfilenode, ForkNumber forknum,
6764
6766
if (relfilenode .relNumber != InvalidOid )
6765
6767
{
6766
6768
BufferTag key ;
6769
+ bool missed_keys = false;
6767
6770
6768
6771
key .spcOid = relfilenode .spcOid ;
6769
6772
key .dbOid = relfilenode .dbOid ;
@@ -6776,22 +6779,37 @@ GetLastWrittenLSNv(RelFileLocator relfilenode, ForkNumber forknum,
6776
6779
key .blockNum = blkno + i ;
6777
6780
6778
6781
entry = hash_search (lastWrittenLsnCache , & key , HASH_FIND , NULL );
6779
-
6780
6782
if (entry != NULL )
6781
6783
{
6782
6784
lsns [i ] = entry -> lsn ;
6783
6785
}
6784
6786
else
6785
6787
{
6786
- lsns [i ] = lsn ;
6787
- SetLastWrittenLSNForBlockRangeInternal (lsn , relfilenode , forknum , key .blockNum , 1 );
6788
+ lsns [i ] = InvalidXLogRecPtr ;
6789
+ missed_keys = true;
6790
+ }
6791
+ }
6792
+ if (missed_keys )
6793
+ {
6794
+ LWLockRelease (LastWrittenLsnLock );
6795
+ LWLockAcquire (LastWrittenLsnLock , LW_EXCLUSIVE );
6796
+
6797
+ lsn = XLogCtl -> maxLastWrittenLsn ;
6798
+
6799
+ for (int i = 0 ; i < nblocks ; i ++ )
6800
+ {
6801
+ if (lsns [i ] == InvalidXLogRecPtr )
6802
+ {
6803
+ SetLastWrittenLSNForBlockRangeInternal (lsn , relfilenode , forknum , key .blockNum , 1 );
6804
+ }
6788
6805
}
6789
6806
}
6790
6807
}
6791
6808
else
6792
6809
{
6793
6810
HASH_SEQ_STATUS seq ;
6794
6811
6812
+ lsn = XLogCtl -> maxLastWrittenLsn ;
6795
6813
/* Find maximum of all cached LSNs */
6796
6814
hash_seq_init (& seq , lastWrittenLsnCache );
6797
6815
while ((entry = (LastWrittenLsnCacheEntry * ) hash_seq_search (& seq )) != NULL )
0 commit comments