From e73abc40fc6bbc087bbcaa109ef6c5b2fe642853 Mon Sep 17 00:00:00 2001 From: Ashwin Agrawal Date: Fri, 2 Aug 2019 15:21:16 -0700 Subject: [PATCH v3 2/3] Optimize PredicateLockTuple(). PredicateLockTuple() has a fast exit if tuple was written by current transaction, as for that case it already has a lock. This check can be performed using TransactionIdIsCurrentTransactionId() instead of using SubTransGetTopmostTransaction(). Since TransactionIdIsCurrentTransactionId() is an all-in-memory operation, it makes this efficient compared to SubTransGetTopmostTransaction(), which can hit the disk. This simplification was proposed by Andres Freund. Author: Ashwin Agrawal Reviewed-by: Thomas Munro Discussion: https://postgr.es/m/CALfoeiv0k3hkEb3Oqk%3DziWqtyk2Jys1UOK5hwRBNeANT_yX%2Bng%40mail.gmail.com --- src/backend/storage/lmgr/predicate.c | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/src/backend/storage/lmgr/predicate.c b/src/backend/storage/lmgr/predicate.c index 78fb90fb1b..d5468b3e29 100644 --- a/src/backend/storage/lmgr/predicate.c +++ b/src/backend/storage/lmgr/predicate.c @@ -2559,24 +2559,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; } /* -- 2.23.0