• Tom Lane's avatar
    Reduce overhead of scanning the backend[] array in LISTEN/NOTIFY. · bca6e643
    Tom Lane authored
    Up to now, async.c scanned its whole array of per-backend state
    whenever it needed to find listening backends.  That's expensive
    if MaxBackends is large, so extend the data structure with list
    links that thread the active entries together.
    
    A downside of this change is that asyncQueueUnregister (unregister
    a listening backend at backend exit) now requires exclusive not shared
    lock, and it can take awhile if there are many other listening
    backends.  We could improve the latter issue by using a doubly- not
    singly-linked list, but it's probably not worth the storage space;
    typical usage patterns for LISTEN/NOTIFY have fairly long-lived
    listeners.
    
    In return for that, Exec_ListenPreCommit (initially register a
    listening backend), SignalBackends, and asyncQueueAdvanceTail
    get significantly faster when MaxBackends is much larger than
    the number of listening backends.  If most of the potential
    backend slots are listening, we don't win, but that's a case
    where the actual interprocess-signal overhead is going to swamp
    these considerations anyway.
    
    Martijn van Oosterhout, hacked a bit more by me
    
    Discussion: https://postgr.es/m/CADWG95vtRBFDdrx1JdT1_9nhOFw48KaeTev6F_LtDQAFVpSPhA@mail.gmail.com
    bca6e643
async.c 71.2 KB