aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/waitlsn.c
diff options
context:
space:
mode:
authorAlexander Korotkov <akorotkov@postgresql.org>2024-04-07 00:31:43 +0300
committerAlexander Korotkov <akorotkov@postgresql.org>2024-04-07 00:49:53 +0300
commit25f42429e2ff2acca35c9154fc2e36b75c79227a (patch)
treea007e1ef361c34cef94c12d8e49bb2e3a2966928 /src/backend/commands/waitlsn.c
parent1577081e9614345534a018e788a2c0bab4da4dc5 (diff)
downloadpostgresql-25f42429e2ff2acca35c9154fc2e36b75c79227a.tar.gz
postgresql-25f42429e2ff2acca35c9154fc2e36b75c79227a.zip
Use an LWLock instead of a spinlock in waitlsn.c
This should prevent busy-waiting when number of waiting processes is high. Discussion: https://postgr.es/m/202404030658.hhj3vfxeyhft%40alvherre.pgsql Author: Alvaro Herrera
Diffstat (limited to 'src/backend/commands/waitlsn.c')
-rw-r--r--src/backend/commands/waitlsn.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/src/backend/commands/waitlsn.c b/src/backend/commands/waitlsn.c
index 51a34d422e2..a57b818a2d4 100644
--- a/src/backend/commands/waitlsn.c
+++ b/src/backend/commands/waitlsn.c
@@ -58,7 +58,6 @@ WaitLSNShmemInit(void)
&found);
if (!found)
{
- SpinLockInit(&waitLSN->waitersHeapMutex);
pg_atomic_init_u64(&waitLSN->minWaitedLSN, PG_UINT64_MAX);
pairingheap_initialize(&waitLSN->waitersHeap, lsn_cmp, NULL);
memset(&waitLSN->procInfos, 0, MaxBackends * sizeof(WaitLSNProcInfo));
@@ -115,13 +114,13 @@ addLSNWaiter(XLogRecPtr lsn)
procInfo->procnum = MyProcNumber;
procInfo->waitLSN = lsn;
- SpinLockAcquire(&waitLSN->waitersHeapMutex);
+ LWLockAcquire(WaitLSNLock, LW_EXCLUSIVE);
pairingheap_add(&waitLSN->waitersHeap, &procInfo->phNode);
procInfo->inHeap = true;
updateMinWaitedLSN();
- SpinLockRelease(&waitLSN->waitersHeapMutex);
+ LWLockRelease(WaitLSNLock);
}
/*
@@ -132,11 +131,11 @@ deleteLSNWaiter(void)
{
WaitLSNProcInfo *procInfo = &waitLSN->procInfos[MyProcNumber];
- SpinLockAcquire(&waitLSN->waitersHeapMutex);
+ LWLockAcquire(WaitLSNLock, LW_EXCLUSIVE);
if (!procInfo->inHeap)
{
- SpinLockRelease(&waitLSN->waitersHeapMutex);
+ LWLockRelease(WaitLSNLock);
return;
}
@@ -144,7 +143,7 @@ deleteLSNWaiter(void)
procInfo->inHeap = false;
updateMinWaitedLSN();
- SpinLockRelease(&waitLSN->waitersHeapMutex);
+ LWLockRelease(WaitLSNLock);
}
/*
@@ -160,7 +159,7 @@ WaitLSNSetLatches(XLogRecPtr currentLSN)
wakeUpProcNums = palloc(sizeof(int) * MaxBackends);
- SpinLockAcquire(&waitLSN->waitersHeapMutex);
+ LWLockAcquire(WaitLSNLock, LW_EXCLUSIVE);
/*
* Iterate the pairing heap of waiting processes till we find LSN not yet
@@ -182,7 +181,7 @@ WaitLSNSetLatches(XLogRecPtr currentLSN)
updateMinWaitedLSN();
- SpinLockRelease(&waitLSN->waitersHeapMutex);
+ LWLockRelease(WaitLSNLock);
/*
* Set latches for processes, whose waited LSNs are already replayed. This