mirror of
https://github.com/postgres/postgres.git
synced 2025-05-01 01:04:50 +03:00
Clarify what is protected by WaitLSNLock
Not just WaitLSNState.waitersHeap, but also WaitLSNState.procInfos and updating of WaitLSNState.minWaitedLSN is protected by WaitLSNLock. There is one now documented exclusion on fast-path checking of WaitLSNProcInfo.inHeap flag. Discussion: https://postgr.es/m/202404030658.hhj3vfxeyhft%40alvherre.pgsql
This commit is contained in:
parent
25f42429e2
commit
ee79928441
@ -109,13 +109,13 @@ addLSNWaiter(XLogRecPtr lsn)
|
|||||||
{
|
{
|
||||||
WaitLSNProcInfo *procInfo = &waitLSN->procInfos[MyProcNumber];
|
WaitLSNProcInfo *procInfo = &waitLSN->procInfos[MyProcNumber];
|
||||||
|
|
||||||
|
LWLockAcquire(WaitLSNLock, LW_EXCLUSIVE);
|
||||||
|
|
||||||
Assert(!procInfo->inHeap);
|
Assert(!procInfo->inHeap);
|
||||||
|
|
||||||
procInfo->procnum = MyProcNumber;
|
procInfo->procnum = MyProcNumber;
|
||||||
procInfo->waitLSN = lsn;
|
procInfo->waitLSN = lsn;
|
||||||
|
|
||||||
LWLockAcquire(WaitLSNLock, LW_EXCLUSIVE);
|
|
||||||
|
|
||||||
pairingheap_add(&waitLSN->waitersHeap, &procInfo->phNode);
|
pairingheap_add(&waitLSN->waitersHeap, &procInfo->phNode);
|
||||||
procInfo->inHeap = true;
|
procInfo->inHeap = true;
|
||||||
updateMinWaitedLSN();
|
updateMinWaitedLSN();
|
||||||
@ -203,6 +203,12 @@ WaitLSNSetLatches(XLogRecPtr currentLSN)
|
|||||||
void
|
void
|
||||||
WaitLSNCleanup(void)
|
WaitLSNCleanup(void)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* We do a fast-path check of the 'inHeap' flag without the lock. This
|
||||||
|
* flag is set to true only by the process itself. So, it's only possible
|
||||||
|
* to get a false positive. But that will be eliminated by a recheck
|
||||||
|
* inside deleteLSNWaiter().
|
||||||
|
*/
|
||||||
if (waitLSN->procInfos[MyProcNumber].inHeap)
|
if (waitLSN->procInfos[MyProcNumber].inHeap)
|
||||||
deleteLSNWaiter();
|
deleteLSNWaiter();
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ typedef struct WaitLSNState
|
|||||||
/*
|
/*
|
||||||
* The minimum LSN value some process is waiting for. Used for the
|
* The minimum LSN value some process is waiting for. Used for the
|
||||||
* fast-path checking if we need to wake up any waiters after replaying a
|
* fast-path checking if we need to wake up any waiters after replaying a
|
||||||
* WAL record.
|
* WAL record. Could be read lock-less. Update protected by WaitLSNLock.
|
||||||
*/
|
*/
|
||||||
pg_atomic_uint64 minWaitedLSN;
|
pg_atomic_uint64 minWaitedLSN;
|
||||||
|
|
||||||
@ -59,7 +59,10 @@ typedef struct WaitLSNState
|
|||||||
*/
|
*/
|
||||||
pairingheap waitersHeap;
|
pairingheap waitersHeap;
|
||||||
|
|
||||||
/* An array with per-process information, indexed by the process number */
|
/*
|
||||||
|
* An array with per-process information, indexed by the process number.
|
||||||
|
* Protected by WaitLSNLock.
|
||||||
|
*/
|
||||||
WaitLSNProcInfo procInfos[FLEXIBLE_ARRAY_MEMBER];
|
WaitLSNProcInfo procInfos[FLEXIBLE_ARRAY_MEMBER];
|
||||||
} WaitLSNState;
|
} WaitLSNState;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user