]> granicus.if.org Git - postgresql/commit
Fix bogus when-to-deregister-from-listener-array logic.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 13 Feb 2013 17:48:20 +0000 (12:48 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 13 Feb 2013 17:48:20 +0000 (12:48 -0500)
commitae1525fdcba5aae4f0efa5ea9803e615644b3e71
tree38c5b4e29d28bc1762b96570beed6adfc6c07494
parent639f5adb97801539b2bd7c35b9e20b14e034d763
Fix bogus when-to-deregister-from-listener-array logic.

Since a backend adds itself to the global listener array during
Exec_ListenPreCommit, it's inappropriate for it to remove itself during
Exec_UnlistenCommit or Exec_UnlistenAllCommit --- that leads to failure
when committing a transaction that did UNLISTEN then LISTEN, since we end
up not registered though we should be.  (This leads to missing later
notifications, or to Assert failures in assert-enabled builds.)  Instead
deal with deregistering at the bottom of AtCommit_Notify, when we know the
final state of the listenChannels list.

Also, simplify the representation of registration status by replacing the
transient backendHasExecutedInitialListen flag with an amRegisteredListener
flag.

Per report from Greg Sabino Mullane.  Back-patch to 9.0, where the problem
was introduced during the LISTEN/NOTIFY rewrite.
src/backend/commands/async.c