diff options
Diffstat (limited to 'src/backend/access/transam')
-rw-r--r-- | src/backend/access/transam/twophase.c | 37 | ||||
-rw-r--r-- | src/backend/access/transam/xact.c | 12 |
2 files changed, 17 insertions, 32 deletions
diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index 234c8d08ebc..5c282002900 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -151,7 +151,6 @@ typedef struct GlobalTransactionData { GlobalTransaction next; /* list link for free list */ int pgprocno; /* ID of associated dummy PGPROC */ - BackendId dummyBackendId; /* similar to backend id for backends */ TimestampTz prepared_at; /* time of preparation */ /* @@ -285,20 +284,6 @@ TwoPhaseShmemInit(void) /* associate it with a PGPROC assigned by InitProcGlobal */ gxacts[i].pgprocno = GetNumberFromPGProc(&PreparedXactProcs[i]); - - /* - * Assign a unique ID for each dummy proc, so that the range of - * dummy backend IDs immediately follows the range of normal - * backend IDs. We don't dare to assign a real backend ID to dummy - * procs, because prepared transactions don't take part in cache - * invalidation like a real backend ID would imply, but having a - * unique ID for them is nevertheless handy. This arrangement - * allows you to allocate an array of size (MaxBackends + - * max_prepared_xacts + 1), and have a slot for every backend and - * prepared transaction. Currently multixact.c uses that - * technique. - */ - gxacts[i].dummyBackendId = MaxBackends + 1 + i; } } else @@ -457,24 +442,24 @@ MarkAsPreparingGuts(GlobalTransaction gxact, TransactionId xid, const char *gid, Assert(LWLockHeldByMeInMode(TwoPhaseStateLock, LW_EXCLUSIVE)); Assert(gxact != NULL); - proc = &ProcGlobal->allProcs[gxact->pgprocno]; + proc = GetPGProcByNumber(gxact->pgprocno); /* Initialize the PGPROC entry */ MemSet(proc, 0, sizeof(PGPROC)); dlist_node_init(&proc->links); proc->waitStatus = PROC_WAIT_STATUS_OK; - if (LocalTransactionIdIsValid(MyProc->lxid)) + if (LocalTransactionIdIsValid(MyProc->vxid.lxid)) { /* clone VXID, for TwoPhaseGetXidByVirtualXID() to find */ - proc->lxid = MyProc->lxid; - proc->backendId = MyBackendId; + proc->vxid.lxid = MyProc->vxid.lxid; + proc->vxid.backendId = MyBackendId; } else { Assert(AmStartupProcess() || !IsPostmasterEnvironment); /* GetLockConflicts() uses this to specify a wait on the XID */ - proc->lxid = xid; - proc->backendId = InvalidBackendId; + proc->vxid.lxid = xid; + proc->vxid.backendId = InvalidBackendId; } proc->xid = xid; Assert(proc->xmin == InvalidTransactionId); @@ -522,7 +507,7 @@ static void GXactLoadSubxactData(GlobalTransaction gxact, int nsubxacts, TransactionId *children) { - PGPROC *proc = &ProcGlobal->allProcs[gxact->pgprocno]; + PGPROC *proc = GetPGProcByNumber(gxact->pgprocno); /* We need no extra lock since the GXACT isn't valid yet */ if (nsubxacts > PGPROC_MAX_CACHED_SUBXIDS) @@ -559,7 +544,7 @@ MarkAsPrepared(GlobalTransaction gxact, bool lock_held) * Put it into the global ProcArray so TransactionIdIsInProgress considers * the XID as still running. */ - ProcArrayAdd(&ProcGlobal->allProcs[gxact->pgprocno]); + ProcArrayAdd(GetPGProcByNumber(gxact->pgprocno)); } /* @@ -583,7 +568,7 @@ LockGXact(const char *gid, Oid user) for (i = 0; i < TwoPhaseState->numPrepXacts; i++) { GlobalTransaction gxact = TwoPhaseState->prepXacts[i]; - PGPROC *proc = &ProcGlobal->allProcs[gxact->pgprocno]; + PGPROC *proc = GetPGProcByNumber(gxact->pgprocno); /* Ignore not-yet-valid GIDs */ if (!gxact->valid) @@ -884,7 +869,7 @@ TwoPhaseGetXidByVirtualXID(VirtualTransactionId vxid, if (!gxact->valid) continue; - proc = &ProcGlobal->allProcs[gxact->pgprocno]; + proc = GetPGProcByNumber(gxact->pgprocno); GET_VXID_FROM_PGPROC(proc_vxid, *proc); if (VirtualTransactionIdEquals(vxid, proc_vxid)) { @@ -919,7 +904,7 @@ TwoPhaseGetDummyBackendId(TransactionId xid, bool lock_held) { GlobalTransaction gxact = TwoPhaseGetGXact(xid, lock_held); - return gxact->dummyBackendId; + return gxact->pgprocno + 1; } /* diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 70ab6e27a13..4ac5b9ea834 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -600,9 +600,9 @@ GetStableLatestTransactionId(void) static LocalTransactionId lxid = InvalidLocalTransactionId; static TransactionId stablexid = InvalidTransactionId; - if (lxid != MyProc->lxid) + if (lxid != MyProc->vxid.lxid) { - lxid = MyProc->lxid; + lxid = MyProc->vxid.lxid; stablexid = GetTopTransactionIdIfAny(); if (!TransactionIdIsValid(stablexid)) stablexid = ReadNextTransactionId(); @@ -2099,8 +2099,8 @@ StartTransaction(void) * Advertise it in the proc array. We assume assignment of * localTransactionId is atomic, and the backendId should be set already. */ - Assert(MyProc->backendId == vxid.backendId); - MyProc->lxid = vxid.localTransactionId; + Assert(MyProc->vxid.backendId == vxid.backendId); + MyProc->vxid.lxid = vxid.localTransactionId; TRACE_POSTGRESQL_TRANSACTION_START(vxid.localTransactionId); @@ -2289,7 +2289,7 @@ CommitTransaction(void) ParallelWorkerReportLastRecEnd(XactLastRecEnd); } - TRACE_POSTGRESQL_TRANSACTION_COMMIT(MyProc->lxid); + TRACE_POSTGRESQL_TRANSACTION_COMMIT(MyProc->vxid.lxid); /* * Let others know about no transaction in progress by me. Note that this @@ -2840,7 +2840,7 @@ AbortTransaction(void) XLogSetAsyncXactLSN(XactLastRecEnd); } - TRACE_POSTGRESQL_TRANSACTION_ABORT(MyProc->lxid); + TRACE_POSTGRESQL_TRANSACTION_ABORT(MyProc->vxid.lxid); /* * Let others know about no transaction in progress by me. Note that this |