diff options
Diffstat (limited to 'src/backend/access/transam/xact.c')
-rw-r--r-- | src/backend/access/transam/xact.c | 103 |
1 files changed, 53 insertions, 50 deletions
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index ca6f6d57d36..8e35c432f5c 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -205,7 +205,7 @@ typedef struct TransactionStateData bool didLogXid; /* has xid been included in WAL record? */ int parallelModeLevel; /* Enter/ExitParallelMode counter */ bool chain; /* start a new block after this one */ - bool assigned; /* assigned to top-level XID */ + bool topXidLogged; /* for a subxact: is top-level XID logged? */ struct TransactionStateData *parent; /* back link to parent */ } TransactionStateData; @@ -238,7 +238,7 @@ typedef struct SerializedTransactionState static TransactionStateData TopTransactionStateData = { .state = TRANS_DEFAULT, .blockState = TBLOCK_DEFAULT, - .assigned = false, + .topXidLogged = false, }; /* @@ -529,6 +529,56 @@ MarkCurrentTransactionIdLoggedIfAny(void) CurrentTransactionState->didLogXid = true; } +/* + * IsSubxactTopXidLogPending + * + * This is used to decide whether we need to WAL log the top-level XID for + * operation in a subtransaction. We require that for logical decoding, see + * LogicalDecodingProcessRecord. + * + * This returns true if wal_level >= logical and we are inside a valid + * subtransaction, for which the assignment was not yet written to any WAL + * record. + */ +bool +IsSubxactTopXidLogPending(void) +{ + /* check whether it is already logged */ + if (CurrentTransactionState->topXidLogged) + return false; + + /* wal_level has to be logical */ + if (!XLogLogicalInfoActive()) + return false; + + /* we need to be in a transaction state */ + if (!IsTransactionState()) + return false; + + /* it has to be a subtransaction */ + if (!IsSubTransaction()) + return false; + + /* the subtransaction has to have a XID assigned */ + if (!TransactionIdIsValid(GetCurrentTransactionIdIfAny())) + return false; + + return true; +} + +/* + * MarkSubxactTopXidLogged + * + * Remember that the top transaction id for the current subtransaction is WAL + * logged now. + */ +void +MarkSubxactTopXidLogged(void) +{ + Assert(IsSubxactTopXidLogPending()); + + CurrentTransactionState->topXidLogged = true; +} /* * GetStableLatestTransactionId @@ -5174,7 +5224,7 @@ PushTransaction(void) GetUserIdAndSecContext(&s->prevUser, &s->prevSecContext); s->prevXactReadOnly = XactReadOnly; s->parallelModeLevel = 0; - s->assigned = false; + s->topXidLogged = false; CurrentTransactionState = s; @@ -6106,50 +6156,3 @@ xact_redo(XLogReaderState *record) else elog(PANIC, "xact_redo: unknown op code %u", info); } - -/* - * IsSubTransactionAssignmentPending - * - * This is used to decide whether we need to WAL log the top-level XID for - * operation in a subtransaction. We require that for logical decoding, see - * LogicalDecodingProcessRecord. - * - * This returns true if wal_level >= logical and we are inside a valid - * subtransaction, for which the assignment was not yet written to any WAL - * record. - */ -bool -IsSubTransactionAssignmentPending(void) -{ - /* wal_level has to be logical */ - if (!XLogLogicalInfoActive()) - return false; - - /* we need to be in a transaction state */ - if (!IsTransactionState()) - return false; - - /* it has to be a subtransaction */ - if (!IsSubTransaction()) - return false; - - /* the subtransaction has to have a XID assigned */ - if (!TransactionIdIsValid(GetCurrentTransactionIdIfAny())) - return false; - - /* and it should not be already 'assigned' */ - return !CurrentTransactionState->assigned; -} - -/* - * MarkSubTransactionAssigned - * - * Mark the subtransaction assignment as completed. - */ -void -MarkSubTransactionAssigned(void) -{ - Assert(IsSubTransactionAssignmentPending()); - - CurrentTransactionState->assigned = true; -} |