]> granicus.if.org Git - postgresql/commitdiff
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;