• Tom Lane's avatar
    Rewrite the sinval messaging mechanism to reduce contention and avoid · fad153ec
    Tom Lane authored
    unnecessary cache resets.  The major changes are:
    
    * When the queue overflows, we only issue a cache reset to the specific
    backend or backends that still haven't read the oldest message, rather
    than resetting everyone as in the original coding.
    
    * When we observe backend(s) falling well behind, we signal SIGUSR1
    to only one backend, the one that is furthest behind and doesn't already
    have a signal outstanding for it.  When it finishes catching up, it will
    in turn signal SIGUSR1 to the next-furthest-back guy, if there is one that
    is far enough behind to justify a signal.  The PMSIGNAL_WAKEN_CHILDREN
    mechanism is removed.
    
    * We don't attempt to clean out dead messages after every message-receipt
    operation; rather, we do it on the insertion side, and only when the queue
    fullness passes certain thresholds.
    
    * Split SInvalLock into SInvalReadLock and SInvalWriteLock so that readers
    don't block writers nor vice versa (except during the infrequent queue
    cleanout operations).
    
    * Transfer multiple sinval messages for each acquisition of a read or
    write lock.
    fad153ec
sinvaladt.c 20 KB