diff options
author | Cheahuychou Mao <mao.cheahuychou@gmail.com> | 2021-09-20 01:12:02 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-09-20 16:43:30 +0000 |
commit | f408ec2ca68e0cc1ee51b6971d688daf2c513ef4 (patch) | |
tree | 0cc1e6de970b0392602917b7ddf7d299bcff5708 | |
parent | efdac6418b6cd6012839c3e87a7b6dc4893d6ef0 (diff) | |
download | mongo-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.cpp | 36 |
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(); }); |