]> granicus.if.org Git - postgresql/commitdiff
Avoid extra locks in GetSnapshotData if old_snapshot_threshold < 0
authorKevin Grittner <kgrittn@postgresql.org>
Tue, 12 Apr 2016 16:48:02 +0000 (11:48 -0500)
committerKevin Grittner <kgrittn@postgresql.org>
Tue, 12 Apr 2016 16:48:02 +0000 (11:48 -0500)
On a big NUMA machine with 1000 connections in saturation load
there was a performance regression due to spinlock contention, for
acquiring values which were never used.  Just fill with dummy
values if we're not going to use them.

This patch has not been benchmarked yet on a big NUMA machine, but
it seems like a good idea on general principle, and it seemed to
prevent an apparent 2.2% regression on a single-socket i7 box
running 200 connections at saturation load.

src/backend/storage/ipc/procarray.c

index 5bc9fd6595e1e2ca29e97585a8e35c1f483c58e4..193035ec26245b679fd5733d371c32a08b454d6d 100644 (file)
@@ -1759,14 +1759,26 @@ GetSnapshotData(Snapshot snapshot)
        snapshot->regd_count = 0;
        snapshot->copied = false;
 
-       /*
-        * Capture the current time and WAL stream location in case this snapshot
-        * becomes old enough to need to fall back on the special "old snapshot"
-        * logic.
-        */
-       snapshot->lsn = GetXLogInsertRecPtr();
-       snapshot->whenTaken = GetSnapshotCurrentTimestamp();
-       MaintainOldSnapshotTimeMapping(snapshot->whenTaken, xmin);
+       if (old_snapshot_threshold < 0)
+       {
+               /*
+                * If not using "snapshot too old" feature, fill related fields with
+                * dummy values that don't require any locking.
+                */
+               snapshot->lsn = InvalidXLogRecPtr;
+               snapshot->whenTaken = 0;
+       }
+       else
+       {
+               /*
+                * Capture the current time and WAL stream location in case this
+                * snapshot becomes old enough to need to fall back on the special
+                * "old snapshot" logic.
+                */
+               snapshot->lsn = GetXLogInsertRecPtr();
+               snapshot->whenTaken = GetSnapshotCurrentTimestamp();
+               MaintainOldSnapshotTimeMapping(snapshot->whenTaken, xmin);
+       }
 
        return snapshot;
 }