diff options
| author | Pavan Deolasee | 2016-01-29 09:13:52 +0000 |
|---|---|---|
| committer | Pavan Deolasee | 2016-10-18 09:48:13 +0000 |
| commit | 52bc23bbed0aeb896a71439bd3888402fd26bcde (patch) | |
| tree | c3218544f88c76a653437c5d441b17694e1ce8c6 | |
| parent | 893d73c95f6af08288ea7b6ff9a58e50a9caa399 (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.c | 20 |
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); |
