aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam/xact.c
diff options
context:
space:
mode:
authorAmit Kapila <akapila@postgresql.org>2021-11-02 08:35:29 +0530
committerAmit Kapila <akapila@postgresql.org>2021-11-02 08:35:29 +0530
commit71db6459e6e4ef623e98f3b1e3e9fed1bfb0ae3b (patch)
tree6194a420c627bd423f9bb4f47e35384eef5a539c /src/backend/access/transam/xact.c
parent43a134f28b350c4b731db9dddf2f53c407a7077f (diff)
downloadpostgresql-71db6459e6e4ef623e98f3b1e3e9fed1bfb0ae3b.tar.gz
postgresql-71db6459e6e4ef623e98f3b1e3e9fed1bfb0ae3b.zip
Replace XLOG_INCLUDE_XID flag with a more localized flag.
Commit 0bead9af484c 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
Diffstat (limited to 'src/backend/access/transam/xact.c')
-rw-r--r--src/backend/access/transam/xact.c103
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;
-}