Skip to content
Snippets Groups Projects
Commit d699ba41 authored by Heikki Linnakangas's avatar Heikki Linnakangas
Browse files

Fix WakeupWaiters() to not wake up an exclusive locker unnecessarily.

WakeupWaiters() is supposed to wake up all LW_WAIT_UNTIL_FREE waiters of
the slot, but the loop incorrectly also woke up the first LW_EXCLUSIVE
waiter, if there was no LW_WAIT_UNTIL_FREE waiters in the queue.

Noted by Andres Freund. This code is new in 9.4, so no backpatching.
parent 6c2744f1
No related branches found
No related tags found
No related merge requests found
......@@ -1842,15 +1842,14 @@ WakeupWaiters(XLogRecPtr EndPos)
slot->xlogInsertingAt = EndPos;
/*
* See if there are any waiters that need to be woken up.
* See if there are any LW_WAIT_UNTIL_FREE waiters that need to be woken
* up. They are always in the front of the queue.
*/
head = slot->head;
if (head != NULL)
if (head != NULL && head->lwWaitMode == LW_WAIT_UNTIL_FREE)
{
proc = head;
/* LW_WAIT_UNTIL_FREE waiters are always in the front of the queue */
next = proc->lwWaitLink;
while (next && next->lwWaitMode == LW_WAIT_UNTIL_FREE)
{
......@@ -1862,6 +1861,8 @@ WakeupWaiters(XLogRecPtr EndPos)
slot->head = next;
proc->lwWaitLink = NULL;
}
else
head = NULL;
/* We are done updating shared state of the lock itself. */
SpinLockRelease(&slot->mutex);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment