aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/transam/xact.c42
1 files changed, 21 insertions, 21 deletions
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index c1ffbd89b88..fd5103a78e2 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -263,7 +263,10 @@ static bool currentCommandIdUsed;
/*
* xactStartTimestamp is the value of transaction_timestamp().
* stmtStartTimestamp is the value of statement_timestamp().
- * xactStopTimestamp is the time at which we log a commit or abort WAL record.
+ * xactStopTimestamp is the time at which we log a commit / abort WAL record,
+ * or if that was skipped, the time of the first subsequent
+ * GetCurrentTransactionStopTimestamp() call.
+ *
* These do not change as we enter and exit subtransactions, so we don't
* keep them inside the TransactionState stack.
*/
@@ -865,15 +868,24 @@ GetCurrentStatementStartTimestamp(void)
/*
* GetCurrentTransactionStopTimestamp
*
- * We return current time if the transaction stop time hasn't been set
- * (which can happen if we decide we don't need to log an XLOG record).
+ * If the transaction stop time hasn't already been set, which can happen if
+ * we decided we don't need to log an XLOG record, set xactStopTimestamp.
*/
TimestampTz
GetCurrentTransactionStopTimestamp(void)
{
- if (xactStopTimestamp != 0)
- return xactStopTimestamp;
- return GetCurrentTimestamp();
+ TransactionState s PG_USED_FOR_ASSERTS_ONLY = CurrentTransactionState;
+
+ /* should only be called after commit / abort processing */
+ Assert(s->state == TRANS_DEFAULT ||
+ s->state == TRANS_COMMIT ||
+ s->state == TRANS_ABORT ||
+ s->state == TRANS_PREPARE);
+
+ if (xactStopTimestamp == 0)
+ xactStopTimestamp = GetCurrentTimestamp();
+
+ return xactStopTimestamp;
}
/*
@@ -892,15 +904,6 @@ SetCurrentStatementStartTimestamp(void)
}
/*
- * SetCurrentTransactionStopTimestamp
- */
-static inline void
-SetCurrentTransactionStopTimestamp(void)
-{
- xactStopTimestamp = GetCurrentTimestamp();
-}
-
-/*
* GetCurrentTransactionNestLevel
*
* Note: this will return zero when not inside any transaction, one when
@@ -1396,9 +1399,7 @@ RecordTransactionCommit(void)
START_CRIT_SECTION();
MyProc->delayChkptFlags |= DELAY_CHKPT_START;
- SetCurrentTransactionStopTimestamp();
-
- XactLogCommitRecord(xactStopTimestamp,
+ XactLogCommitRecord(GetCurrentTransactionStopTimestamp(),
nchildren, children, nrels, rels,
ndroppedstats, droppedstats,
nmsgs, invalMessages,
@@ -1422,7 +1423,7 @@ RecordTransactionCommit(void)
*/
if (!replorigin || replorigin_session_origin_timestamp == 0)
- replorigin_session_origin_timestamp = xactStopTimestamp;
+ replorigin_session_origin_timestamp = GetCurrentTransactionStopTimestamp();
TransactionTreeSetCommitTsData(xid, nchildren, children,
replorigin_session_origin_timestamp,
@@ -1754,8 +1755,7 @@ RecordTransactionAbort(bool isSubXact)
xact_time = GetCurrentTimestamp();
else
{
- SetCurrentTransactionStopTimestamp();
- xact_time = xactStopTimestamp;
+ xact_time = GetCurrentTransactionStopTimestamp();
}
XactLogAbortRecord(xact_time,