From: "Andres Freund" <and...@2ndquadrant.com>
which means they manipulate the lwWaitLink queue without
protection. That's done intentionally. The code tries to protect against
corruption of the list to do a woken up backend acquiring a lock (this
or an independent one) by only continuing when the lwWaiting flag is set
to false. Unfortunately there's absolutely no guarantee that a) the
assignment to lwWaitLink and lwWaiting are done in that order b) that
the stores are done in-order from the POV of other backends.
So what we need to do is to acquire a write barrier between the
assignments to lwWaitLink and lwWaiting, i.e.
       proc->lwWaitLink = NULL;
       pg_write_barrier();
       proc->lwWaiting = false;
the reader side already uses an implicit barrier by using spinlocks.

I've got a report from one customer that they encountered a hang during performance benchmarking. They were using PostgreSQL 9.2.4. I remember that the stack trace showed many backends blocked forever at LWLockAcuuire() during btree insert operation. I'm not sure this has something to do with what you are raising, but the release notes for 9.2.5/6 doesn't suggest any fixes for this. So I felt there is something wrong with lwlocks.

Do you think that your question could cause my customer's problem -- backends block at lwlock forever?

Regards
MauMau



--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to