• Andres Freund's avatar
    snapshot scalability: cache snapshots using a xact completion counter. · 623a9ba7
    Andres Freund authored
    Previous commits made it faster/more scalable to compute snapshots. But not
    building a snapshot is still faster. Now that GetSnapshotData() does not
    maintain RecentGlobal* anymore, that is actually not too hard:
    
    This commit introduces xactCompletionCount, which tracks the number of
    top-level transactions with xids (i.e. which may have modified the database)
    that completed in some form since the start of the server.
    
    We can avoid rebuilding the snapshot's contents whenever the current
    xactCompletionCount is the same as it was when the snapshot was
    originally built.  Currently this check happens while holding
    ProcArrayLock. While it's likely possible to perform the check without
    acquiring ProcArrayLock, it seems better to do that separately /
    later, some careful analysis is required. Even with the lock this is a
    significant win on its own.
    
    On a smaller two socket machine this gains another ~1.03x, on a larger
    machine the effect is roughly double (earlier patch version tested
    though).  If we were able to safely avoid the lock there'd be another
    significant gain on top of that.
    
    Author: Andres Freund <andres@anarazel.de>
    Reviewed-By: default avatarRobert Haas <robertmhaas@gmail.com>
    Reviewed-By: default avatarThomas Munro <thomas.munro@gmail.com>
    Reviewed-By: default avatarDavid Rowley <dgrowleyml@gmail.com>
    Discussion: https://postgr.es/m/20200301083601.ews6hz5dduc3w2se@alap3.anarazel.de
    623a9ba7
snapshot.h 7.83 KB