• Heikki Linnakangas's avatar
    Make group commit more effective. · 9b38d46d
    Heikki Linnakangas authored
    When a backend needs to flush the WAL, and someone else is already flushing
    the WAL, wait until it releases the WALInsertLock and check if we still need
    to do the flush or if the other backend already did the work for us, before
    acquiring WALInsertLock. This helps group commit, because when the WAL flush
    finishes, all the backends that were waiting for it can be woken up in one
    go, and the can all concurrently observe that they're done, rather than
    waking them up one by one in a cascading fashion.
    
    This is based on a new LWLock function, LWLockWaitUntilFree(), which has
    peculiar semantics. If the lock is immediately free, it grabs the lock and
    returns true. If it's not free, it waits until it is released, but then
    returns false without grabbing the lock. This is used in XLogFlush(), so
    that when the lock is acquired, the backend flushes the WAL, but if it's
    not, the backend first checks the current flush location before retrying.
    
    Original patch and benchmarking by Peter Geoghegan and Simon Riggs, although
    this patch as committed ended up being very different from that.
    9b38d46d
lwlock.h 3.57 KB