• Tom Lane's avatar
    Fix bogus when-to-deregister-from-listener-array logic. · cd89965a
    Tom Lane authored
    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.
    cd89965a
async.c 65.8 KB