summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavan Deolasee2016-01-29 09:13:52 +0000
committerPavan Deolasee2016-10-18 09:48:13 +0000
commit52bc23bbed0aeb896a71439bd3888402fd26bcde (patch)
treec3218544f88c76a653437c5d441b17694e1ce8c6
parent893d73c95f6af08288ea7b6ff9a58e50a9caa399 (diff)
Do not hold the XidGenLock while obtaining an XID from the GTM
This was an oversight when on-demand GXID work was committed. Mason reported that this patch significantly improves performance on his tests and I can also confirm that with my own tests. Report and patch by Mason Sharp, with some changes from me.
-rw-r--r--src/backend/access/transam/varsup.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 4a6d3f6152..1e601a68ca 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -206,11 +206,7 @@ GetNewTransactionId(bool isSubXact)
}
*timestamp_received = true;
}
-#endif /* PGXC */
-
- LWLockAcquire(XidGenLock, LW_EXCLUSIVE);
-#ifdef PGXC
/*
* Unless we are running initdb (which sets useLocalXid to true), we must
* have either got a valid global XID, either from the coordinator/datanode
@@ -222,8 +218,6 @@ GetNewTransactionId(bool isSubXact)
{
xid = next_xid;
next_xid = InvalidTransactionId;
- if (TransactionIdFollowsOrEquals(xid, ShmemVariableCache->nextXid))
- ShmemVariableCache->nextXid = xid;
}
else if ((IsConnFromCoord() || IsConnFromDatanode()) &&
MyCoordId != InvalidOid && MyCoordPid != 0 &&
@@ -279,10 +273,17 @@ GetNewTransactionId(bool isSubXact)
}
}
}
+ LWLockAcquire(XidGenLock, LW_EXCLUSIVE);
+ if (TransactionIdFollowsOrEquals(xid, ShmemVariableCache->nextXid))
+ ShmemVariableCache->nextXid = xid;
}
else
+ {
+ LWLockAcquire(XidGenLock, LW_EXCLUSIVE);
xid = ShmemVariableCache->nextXid;
+ }
#else
+ LWLockAcquire(XidGenLock, LW_EXCLUSIVE);
xid = ShmemVariableCache->nextXid;
#endif /* PGXC */
@@ -442,8 +443,11 @@ GetNewTransactionId(bool isSubXact)
*/
if (increment_xid || !IsPostmasterEnvironment)
{
- ShmemVariableCache->nextXid = xid;
- TransactionIdAdvance(ShmemVariableCache->nextXid);
+ if (TransactionIdFollowsOrEquals(xid, ShmemVariableCache->nextXid))
+ {
+ ShmemVariableCache->nextXid = xid;
+ TransactionIdAdvance(ShmemVariableCache->nextXid);
+ }
}
#else
TransactionIdAdvance(ShmemVariableCache->nextXid);