mirror of
https://github.com/postgres/postgres.git
synced 2025-12-21 05:21:08 +03:00
Use atomic access for SlruShared->latest_page_number
The new concurrency model proposed for slru.c to improve performance does not include any single lock that would coordinate processes doing concurrent reads/writes on SlruShared->latest_page_number. We can instead use atomic reads and writes for that variable. Author: Dilip Kumar <dilipbalaut@gmail.com> Reviewed-by: Andrey M. Borodin <x4mmm@yandex-team.ru> Discussion: https://postgr.es/m/CAFiTN-vzDvNz=ExGXz6gdyjtzGixKSqs0mKHMmaQ8sOSEFZ33A@mail.gmail.com
This commit is contained in:
@@ -2017,13 +2017,15 @@ StartupMultiXact(void)
|
||||
* Initialize offset's idea of the latest page number.
|
||||
*/
|
||||
pageno = MultiXactIdToOffsetPage(multi);
|
||||
MultiXactOffsetCtl->shared->latest_page_number = pageno;
|
||||
pg_atomic_write_u64(&MultiXactOffsetCtl->shared->latest_page_number,
|
||||
pageno);
|
||||
|
||||
/*
|
||||
* Initialize member's idea of the latest page number.
|
||||
*/
|
||||
pageno = MXOffsetToMemberPage(offset);
|
||||
MultiXactMemberCtl->shared->latest_page_number = pageno;
|
||||
pg_atomic_write_u64(&MultiXactMemberCtl->shared->latest_page_number,
|
||||
pageno);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2047,14 +2049,15 @@ TrimMultiXact(void)
|
||||
oldestMXactDB = MultiXactState->oldestMultiXactDB;
|
||||
LWLockRelease(MultiXactGenLock);
|
||||
|
||||
/* Clean up offsets state */
|
||||
LWLockAcquire(MultiXactOffsetSLRULock, LW_EXCLUSIVE);
|
||||
|
||||
/*
|
||||
* (Re-)Initialize our idea of the latest page number for offsets.
|
||||
*/
|
||||
pageno = MultiXactIdToOffsetPage(nextMXact);
|
||||
MultiXactOffsetCtl->shared->latest_page_number = pageno;
|
||||
pg_atomic_write_u64(&MultiXactOffsetCtl->shared->latest_page_number,
|
||||
pageno);
|
||||
|
||||
/* Clean up offsets state */
|
||||
LWLockAcquire(MultiXactOffsetSLRULock, LW_EXCLUSIVE);
|
||||
|
||||
/*
|
||||
* Zero out the remainder of the current offsets page. See notes in
|
||||
@@ -2081,14 +2084,16 @@ TrimMultiXact(void)
|
||||
|
||||
LWLockRelease(MultiXactOffsetSLRULock);
|
||||
|
||||
/* And the same for members */
|
||||
LWLockAcquire(MultiXactMemberSLRULock, LW_EXCLUSIVE);
|
||||
|
||||
/*
|
||||
* And the same for members.
|
||||
*
|
||||
* (Re-)Initialize our idea of the latest page number for members.
|
||||
*/
|
||||
pageno = MXOffsetToMemberPage(offset);
|
||||
MultiXactMemberCtl->shared->latest_page_number = pageno;
|
||||
pg_atomic_write_u64(&MultiXactMemberCtl->shared->latest_page_number,
|
||||
pageno);
|
||||
|
||||
LWLockAcquire(MultiXactMemberSLRULock, LW_EXCLUSIVE);
|
||||
|
||||
/*
|
||||
* Zero out the remainder of the current members page. See notes in
|
||||
@@ -3333,7 +3338,8 @@ multixact_redo(XLogReaderState *record)
|
||||
* SimpleLruTruncate.
|
||||
*/
|
||||
pageno = MultiXactIdToOffsetPage(xlrec.endTruncOff);
|
||||
MultiXactOffsetCtl->shared->latest_page_number = pageno;
|
||||
pg_atomic_write_u64(&MultiXactOffsetCtl->shared->latest_page_number,
|
||||
pageno);
|
||||
PerformOffsetsTruncation(xlrec.startTruncOff, xlrec.endTruncOff);
|
||||
|
||||
LWLockRelease(MultiXactTruncationLock);
|
||||
|
||||
Reference in New Issue
Block a user