Add fast paths for cases when no serializable transactions are running.
authorRobert Haas <rhaas@postgresql.org>
Mon, 25 Apr 2011 13:52:01 +0000 (09:52 -0400)
committerRobert Haas <rhaas@postgresql.org>
Mon, 25 Apr 2011 13:52:01 +0000 (09:52 -0400)
Dan Ports

src/backend/storage/lmgr/predicate.c

index f02d5d5a1e465db2e54f466c1ce538c2fdb5c5b5..48ff9cc151d89435bbeeef25ec8e5ba9b58c344a 100644 (file)
@@ -2275,6 +2275,18 @@ PredicateLockTupleRowVersionLink(const Relation relation,
    TransactionId oldxmin,
                newxmin;
 
+   /*
+    * Bail out quickly if there are no serializable transactions
+    * running.
+    *
+    * It's safe to do this check without taking any additional
+    * locks. Even if a serializable transaction starts concurrently,
+    * we know it can't take any SIREAD locks on the modified tuple
+    * because the caller is holding the associated buffer page lock.
+    */
+   if (!TransactionIdIsValid(PredXact->SxactGlobalXmin))
+       return;
+
    oldblk = ItemPointerGetBlockNumber(&(oldTuple->t_self));
    oldoff = ItemPointerGetOffsetNumber(&(oldTuple->t_self));
    oldxmin = HeapTupleHeaderGetXmin(oldTuple->t_data);
@@ -2633,6 +2645,15 @@ PredicateLockPageSplit(const Relation relation, const BlockNumber oldblkno,
    PREDICATELOCKTARGETTAG newtargettag;
    bool        success;
 
+   /*
+    * Bail out quickly if there are no serializable transactions
+    * running. As with PredicateLockTupleRowVersionLink, it's safe to
+    * check this without taking locks because the caller is holding
+    * the buffer page lock.
+    */
+   if (!TransactionIdIsValid(PredXact->SxactGlobalXmin))
+       return;
+
    if (SkipSplitTracking(relation))
        return;