Skip to content

Commit 19dab9f

Browse files
author
Konstantin Knizhnik
committed
Optimize vector get last written LSN
1 parent 9c9e9a7 commit 19dab9f

File tree

1 file changed

+19
-12
lines changed
  • src/backend/access/transam

1 file changed

+19
-12
lines changed

src/backend/access/transam/xlog.c

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6747,52 +6747,59 @@ GetLastWrittenLSNv(RelFileLocator relfilenode, ForkNumber forknum,
67476747
Assert(nblocks > 0);
67486748
Assert(PointerIsValid(lsns));
67496749

6750-
LWLockAcquire(LastWrittenLsnLock, LW_SHARED);
6751-
67526750
if (relfilenode.relNumber != InvalidOid)
67536751
{
67546752
BufferTag key;
6753+
XLogRecPtr max_lsn;
6754+
67556755
key.spcOid = relfilenode.spcOid;
67566756
key.dbOid = relfilenode.dbOid;
67576757
key.relNumber = relfilenode.relNumber;
67586758
key.forkNum = forknum;
67596759

6760+
LWLockAcquire(LastWrittenLsnLock, LW_SHARED);
6761+
67606762
for (int i = 0; i < nblocks; i++)
67616763
{
67626764
/* Maximal last written LSN among all non-cached pages */
67636765
key.blockNum = blkno + i;
67646766

67656767
entry = hash_search(lastWrittenLsnCache, &key, HASH_FIND, NULL);
67666768

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;
67736772

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);
67776781
}
67786782
}
67796783
}
67806784
else
67816785
{
67826786
HASH_SEQ_STATUS seq;
67836787
XLogRecPtr lsn = XLogCtl->maxLastWrittenLsn;
6788+
6789+
LWLockAcquire(LastWrittenLsnLock, LW_SHARED);
6790+
67846791
/* Find maximum of all cached LSNs */
67856792
hash_seq_init(&seq, lastWrittenLsnCache);
67866793
while ((entry = (LastWrittenLsnCacheEntry *) hash_seq_search(&seq)) != NULL)
67876794
{
67886795
if (entry->lsn > lsn)
67896796
lsn = entry->lsn;
67906797
}
6798+
LWLockRelease(LastWrittenLsnLock);
67916799

67926800
for (int i = 0; i < nblocks; i++)
67936801
lsns[i] = lsn;
67946802
}
6795-
LWLockRelease(LastWrittenLsnLock);
67966803
}
67976804

67986805
/*

0 commit comments

Comments
 (0)