diff options
author | Thomas Munro <tmunro@postgresql.org> | 2019-11-11 16:34:01 +1300 |
---|---|---|
committer | Thomas Munro <tmunro@postgresql.org> | 2019-11-11 17:06:59 +1300 |
commit | db2687d1f3787aa8113b3dbb358153feee30c64c (patch) | |
tree | 077c225c3a719ca4193038165ca152af97f6ac0c /src | |
parent | 695c5977c8bc115029a85dcc1821d7b0136b4e4c (diff) | |
download | postgresql-db2687d1f3787aa8113b3dbb358153feee30c64c.tar.gz postgresql-db2687d1f3787aa8113b3dbb358153feee30c64c.zip |
Optimize PredicateLockTuple().
PredicateLockTuple() has a fast exit if tuple was written by the current
transaction, as in that case it already has a lock. This check can be
performed using TransactionIdIsCurrentTransactionId() instead of
SubTransGetTopmostTransaction(), to avoid any chance of having to hit the
disk.
Author: Ashwin Agrawal, based on a suggestion from Andres Freund
Reviewed-by: Thomas Munro
Discussion: https://postgr.es/m/CALfoeiv0k3hkEb3Oqk%3DziWqtyk2Jys1UOK5hwRBNeANT_yX%2Bng%40mail.gmail.com
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/storage/lmgr/predicate.c | 22 |
1 files changed, 3 insertions, 19 deletions
diff --git a/src/backend/storage/lmgr/predicate.c b/src/backend/storage/lmgr/predicate.c index 78fb90fb1bd..86b46d68b99 100644 --- a/src/backend/storage/lmgr/predicate.c +++ b/src/backend/storage/lmgr/predicate.c @@ -2549,7 +2549,6 @@ PredicateLockTuple(Relation relation, HeapTuple tuple, Snapshot snapshot) { PREDICATELOCKTARGETTAG tag; ItemPointer tid; - TransactionId targetxmin; if (!SerializationNeededForRead(relation, snapshot)) return; @@ -2559,24 +2558,9 @@ PredicateLockTuple(Relation relation, HeapTuple tuple, Snapshot snapshot) */ if (relation->rd_index == NULL) { - TransactionId myxid; - - targetxmin = HeapTupleHeaderGetXmin(tuple->t_data); - - myxid = GetTopTransactionIdIfAny(); - if (TransactionIdIsValid(myxid)) - { - if (TransactionIdFollowsOrEquals(targetxmin, TransactionXmin)) - { - TransactionId xid = SubTransGetTopmostTransaction(targetxmin); - - if (TransactionIdEquals(xid, myxid)) - { - /* We wrote it; we already have a write lock. */ - return; - } - } - } + /* If we wrote it; we already have a write lock. */ + if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXmin(tuple->t_data))) + return; } /* |