Add fast paths for cases when no serializable transactions are running.

Dan Ports
This commit is contained in:
Robert Haas 2011-04-25 09:52:01 -04:00
parent 97e8346851
commit 02e6a115cc
1 changed files with 21 additions and 0 deletions

View 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;