mirror of
https://github.com/postgres/postgres.git
synced 2025-11-28 11:44:57 +03:00
Replace XLOG_INCLUDE_XID flag with a more localized flag.
Commit 0bead9af48 introduced XLOG_INCLUDE_XID flag to indicate that the
WAL record contains subXID-to-topXID association. It uses that flag later
to mark in CurrentTransactionState that top-xid is logged so that we
should not try to log it again with the next WAL record in the current
subtransaction. However, we can use a localized variable to pass that
information.
In passing, change the related function and variable names to make them
consistent with what the code is actually doing.
Author: Dilip Kumar
Reviewed-by: Alvaro Herrera, Amit Kapila
Discussion: https://postgr.es/m/E1mSoYz-0007Fh-D9@gemulon.postgresql.org
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user