• Tom Lane's avatar
    Fix LISTEN/NOTIFY race condition reported by Laurent Birtz, by postponing · 033eb158
    Tom Lane authored
    pg_listener modifications commanded by LISTEN and UNLISTEN until the end
    of the current transaction.  This allows us to hold the ExclusiveLock on
    pg_listener until after commit, with no greater risk of deadlock than there
    was before.  Aside from fixing the race condition, this gets rid of a
    truly ugly kludge that was there before, namely having to ignore
    HeapTupleBeingUpdated failures during NOTIFY.  There is a small potential
    incompatibility, which is that if a transaction issues LISTEN or UNLISTEN
    and then looks into pg_listener before committing, it won't see any resulting
    row insertion or deletion, where before it would have.  It seems unlikely
    that anyone would be depending on that, though.
    
    This patch also disallows LISTEN and UNLISTEN inside a prepared transaction.
    That case had some pretty undesirable properties already, such as possibly
    allowing pg_listener entries to be made for PIDs no longer present, so
    disallowing it seems like a better idea than trying to maintain the behavior.
    033eb158
async.c 33 KB