|
|
@ -112,7 +112,7 @@ addLSNWaiter(XLogRecPtr lsn) |
|
|
|
|
|
|
|
|
|
|
|
Assert(!procInfo->inHeap); |
|
|
|
Assert(!procInfo->inHeap); |
|
|
|
|
|
|
|
|
|
|
|
procInfo->latch = MyLatch; |
|
|
|
procInfo->procno = MyProcNumber; |
|
|
|
procInfo->waitLSN = lsn; |
|
|
|
procInfo->waitLSN = lsn; |
|
|
|
|
|
|
|
|
|
|
|
pairingheap_add(&waitLSNState->waitersHeap, &procInfo->phNode); |
|
|
|
pairingheap_add(&waitLSNState->waitersHeap, &procInfo->phNode); |
|
|
@ -154,16 +154,17 @@ void |
|
|
|
WaitLSNSetLatches(XLogRecPtr currentLSN) |
|
|
|
WaitLSNSetLatches(XLogRecPtr currentLSN) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int i; |
|
|
|
int i; |
|
|
|
Latch **wakeUpProcLatches; |
|
|
|
ProcNumber *wakeUpProcs; |
|
|
|
int numWakeUpProcs = 0; |
|
|
|
int numWakeUpProcs = 0; |
|
|
|
|
|
|
|
|
|
|
|
wakeUpProcLatches = palloc(sizeof(Latch *) * MaxBackends); |
|
|
|
wakeUpProcs = palloc(sizeof(ProcNumber) * MaxBackends); |
|
|
|
|
|
|
|
|
|
|
|
LWLockAcquire(WaitLSNLock, LW_EXCLUSIVE); |
|
|
|
LWLockAcquire(WaitLSNLock, LW_EXCLUSIVE); |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
|
* Iterate the pairing heap of waiting processes till we find LSN not yet |
|
|
|
* Iterate the pairing heap of waiting processes till we find LSN not yet |
|
|
|
* replayed. Record the process latches to set them later. |
|
|
|
* replayed. Record the process numbers to wake up, but to avoid holding |
|
|
|
|
|
|
|
* the lock for too long, send the wakeups only after releasing the lock. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
while (!pairingheap_is_empty(&waitLSNState->waitersHeap)) |
|
|
|
while (!pairingheap_is_empty(&waitLSNState->waitersHeap)) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -174,7 +175,7 @@ WaitLSNSetLatches(XLogRecPtr currentLSN) |
|
|
|
procInfo->waitLSN > currentLSN) |
|
|
|
procInfo->waitLSN > currentLSN) |
|
|
|
break; |
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
wakeUpProcLatches[numWakeUpProcs++] = procInfo->latch; |
|
|
|
wakeUpProcs[numWakeUpProcs++] = procInfo->procno; |
|
|
|
(void) pairingheap_remove_first(&waitLSNState->waitersHeap); |
|
|
|
(void) pairingheap_remove_first(&waitLSNState->waitersHeap); |
|
|
|
procInfo->inHeap = false; |
|
|
|
procInfo->inHeap = false; |
|
|
|
} |
|
|
|
} |
|
|
@ -191,9 +192,9 @@ WaitLSNSetLatches(XLogRecPtr currentLSN) |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
for (i = 0; i < numWakeUpProcs; i++) |
|
|
|
for (i = 0; i < numWakeUpProcs; i++) |
|
|
|
{ |
|
|
|
{ |
|
|
|
SetLatch(wakeUpProcLatches[i]); |
|
|
|
SetLatch(&GetPGProcByNumber(wakeUpProcs[i])->procLatch); |
|
|
|
} |
|
|
|
} |
|
|
|
pfree(wakeUpProcLatches); |
|
|
|
pfree(wakeUpProcs); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
|