summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCheahuychou Mao <mao.cheahuychou@gmail.com>2021-09-20 01:12:02 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-09-20 16:43:30 +0000
commitf408ec2ca68e0cc1ee51b6971d688daf2c513ef4 (patch)
tree0cc1e6de970b0392602917b7ddf7d299bcff5708
parentefdac6418b6cd6012839c3e87a7b6dc4893d6ef0 (diff)
downloadmongo-f408ec2ca68e0cc1ee51b6971d688daf2c513ef4.tar.gz
SERVER-60061 Avoid checking internal transactions feature flag more than once when constructing transaction oplog entries and config.transactions entry
-rw-r--r--src/mongo/db/op_observer_impl.cpp36
1 files changed, 20 insertions, 16 deletions
diff --git a/src/mongo/db/op_observer_impl.cpp b/src/mongo/db/op_observer_impl.cpp
index 761ccca0f94..cf107fab9d3 100644
--- a/src/mongo/db/op_observer_impl.cpp
+++ b/src/mongo/db/op_observer_impl.cpp
@@ -128,17 +128,9 @@ void onWriteOpCompleted(OperationContext* opCtx,
// be uninitialized.
return;
- const bool inMultiDocumentTransaction = txnParticipant.transactionIsOpen();
-
// We add these here since they may not exist if we return early.
sessionTxnRecord.setSessionId(*opCtx->getLogicalSessionId());
sessionTxnRecord.setTxnNum(*opCtx->getTxnNumber());
- if (feature_flags::gFeatureFlagInternalTransactions.isEnabled(
- serverGlobalParams.featureCompatibility) &&
- inMultiDocumentTransaction) {
- invariant(opCtx->getTxnRetryCounter());
- sessionTxnRecord.setTxnRetryCounter(*opCtx->getTxnRetryCounter());
- }
txnParticipant.onWriteOpCompletedOnPrimary(opCtx, std::move(stmtIdsWritten), sessionTxnRecord);
}
@@ -1193,14 +1185,17 @@ OpTimeBundle logApplyOpsForTransaction(OperationContext* opCtx,
boost::optional<DurableTxnStateEnum> txnState,
boost::optional<repl::OpTime> startOpTime,
const bool updateTxnTable) {
+ const bool areInternalTransactionsEnabled =
+ feature_flags::gFeatureFlagInternalTransactions.isEnabled(
+ serverGlobalParams.featureCompatibility);
+ const auto txnRetryCounter = *opCtx->getTxnRetryCounter();
+
oplogEntry->setOpType(repl::OpTypeEnum::kCommand);
oplogEntry->setNss({"admin", "$cmd"});
oplogEntry->setSessionId(opCtx->getLogicalSessionId());
oplogEntry->setTxnNumber(opCtx->getTxnNumber());
- if (feature_flags::gFeatureFlagInternalTransactions.isEnabled(
- serverGlobalParams.featureCompatibility)) {
- invariant(opCtx->getTxnRetryCounter());
- oplogEntry->getOperationSessionInfo().setTxnRetryCounter(*opCtx->getTxnRetryCounter());
+ if (areInternalTransactionsEnabled) {
+ oplogEntry->getOperationSessionInfo().setTxnRetryCounter(txnRetryCounter);
}
try {
@@ -1213,6 +1208,9 @@ OpTimeBundle logApplyOpsForTransaction(OperationContext* opCtx,
sessionTxnRecord.setLastWriteDate(times.wallClockTime);
sessionTxnRecord.setState(txnState);
sessionTxnRecord.setStartOpTime(startOpTime);
+ if (areInternalTransactionsEnabled) {
+ sessionTxnRecord.setTxnRetryCounter(txnRetryCounter);
+ }
onWriteOpCompleted(opCtx, {}, sessionTxnRecord);
}
return times;
@@ -1379,14 +1377,17 @@ int logOplogEntriesForTransaction(OperationContext* opCtx,
void logCommitOrAbortForPreparedTransaction(OperationContext* opCtx,
MutableOplogEntry* oplogEntry,
DurableTxnStateEnum durableState) {
+ const bool areInternalTransactionsEnabled =
+ feature_flags::gFeatureFlagInternalTransactions.isEnabled(
+ serverGlobalParams.featureCompatibility);
+ const auto txnRetryCounter = *opCtx->getTxnRetryCounter();
+
oplogEntry->setOpType(repl::OpTypeEnum::kCommand);
oplogEntry->setNss({"admin", "$cmd"});
oplogEntry->setSessionId(opCtx->getLogicalSessionId());
oplogEntry->setTxnNumber(opCtx->getTxnNumber());
- if (feature_flags::gFeatureFlagInternalTransactions.isEnabled(
- serverGlobalParams.featureCompatibility)) {
- invariant(opCtx->getTxnRetryCounter());
- oplogEntry->getOperationSessionInfo().setTxnRetryCounter(*opCtx->getTxnRetryCounter());
+ if (areInternalTransactionsEnabled) {
+ oplogEntry->getOperationSessionInfo().setTxnRetryCounter(txnRetryCounter);
}
oplogEntry->setPrevWriteOpTimeInTransaction(
TransactionParticipant::get(opCtx).getLastWriteOpTime());
@@ -1413,6 +1414,9 @@ void logCommitOrAbortForPreparedTransaction(OperationContext* opCtx,
sessionTxnRecord.setLastWriteOpTime(oplogOpTime);
sessionTxnRecord.setLastWriteDate(oplogEntry->getWallClockTime());
sessionTxnRecord.setState(durableState);
+ if (areInternalTransactionsEnabled) {
+ sessionTxnRecord.setTxnRetryCounter(txnRetryCounter);
+ }
onWriteOpCompleted(opCtx, {}, sessionTxnRecord);
wuow.commit();
});