diff options
author | XueruiFa <xuerui.fa@mongodb.com> | 2020-08-19 15:52:12 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-08-19 20:18:54 +0000 |
commit | d3169bf266e409f68784aa512511c680b5cc6aa4 (patch) | |
tree | 3d9a546e87f5cc5c0cde61329aa73af10cf9f373 /src/mongo/db/transaction_participant.cpp | |
parent | 45a9e0a76e4a9ef995b3490d74610cab98dbcc0a (diff) | |
download | mongo-d3169bf266e409f68784aa512511c680b5cc6aa4.tar.gz |
SERVER-49377: Ensure transactions inherit API parameters of initiating command
Diffstat (limited to 'src/mongo/db/transaction_participant.cpp')
-rw-r--r-- | src/mongo/db/transaction_participant.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/mongo/db/transaction_participant.cpp b/src/mongo/db/transaction_participant.cpp index 9b7d6ae21d3..5a63291993d 100644 --- a/src/mongo/db/transaction_participant.cpp +++ b/src/mongo/db/transaction_participant.cpp @@ -745,6 +745,7 @@ TransactionParticipant::TxnResources::TxnResources(WithLock wl, opCtx->getServiceContext()->getStorageEngine()->newRecoveryUnit()), WriteUnitOfWork::RecoveryUnitState::kNotInUnitOfWork); + _apiParameters = APIParameters::get(opCtx); _readConcernArgs = repl::ReadConcernArgs::get(opCtx); _uncommittedCollections = UncommittedCollections::get(opCtx).shareResources(); } @@ -821,6 +822,9 @@ void TransactionParticipant::TxnResources::release(OperationContext* opCtx) { opCtx->setWriteUnitOfWork(WriteUnitOfWork::createForSnapshotResume(opCtx, _ruState)); + auto& apiParameters = APIParameters::get(opCtx); + apiParameters = _apiParameters; + auto& readConcernArgs = repl::ReadConcernArgs::get(opCtx); readConcernArgs = _readConcernArgs; } @@ -1487,6 +1491,15 @@ void TransactionParticipant::Participant::shutdown(OperationContext* opCtx) { o(lock).txnResourceStash = boost::none; } +APIParameters TransactionParticipant::Participant::getAPIParameters(OperationContext* opCtx) const { + // If we have are in a retryable write, use the API parameters that the client passed in with + // the write, instead of the first write's API parameters. + if (o().txnResourceStash && !o().txnState.isInRetryableWriteMode()) { + return o().txnResourceStash->getAPIParameters(); + } + return APIParameters::get(opCtx); +} + bool TransactionParticipant::Observer::expiredAsOf(Date_t when) const { return o().txnState.isInProgress() && o().transactionExpireDate && o().transactionExpireDate < when; @@ -1635,6 +1648,7 @@ void TransactionParticipant::Participant::_abortTransactionOnSession(OperationCo _logSlowTransaction(opCtx, &(o().txnResourceStash->locker()->getLockerInfo(boost::none))->stats, TerminationCause::kAborted, + o().txnResourceStash->getAPIParameters(), o().txnResourceStash->getReadConcernArgs()); } @@ -1652,6 +1666,7 @@ void TransactionParticipant::Participant::_cleanUpTxnResourceOnOpCtx( opCtx, &(opCtx->lockState()->getLockerInfo(CurOp::get(*opCtx)->getLockStatsBase()))->stats, terminationCause, + APIParameters::get(opCtx), repl::ReadConcernArgs::get(opCtx)); // Reset the WUOW. We should be able to abort empty transactions that don't have WUOW. @@ -1869,6 +1884,7 @@ std::string TransactionParticipant::Participant::_transactionInfoForLog( OperationContext* opCtx, const SingleThreadedLockStats* lockStats, TerminationCause terminationCause, + APIParameters apiParameters, repl::ReadConcernArgs readConcernArgs) const { invariant(lockStats); @@ -1883,6 +1899,7 @@ std::string TransactionParticipant::Participant::_transactionInfoForLog( parametersBuilder.append("txnNumber", o().activeTxnNumber); parametersBuilder.append("autocommit", p().autoCommit ? *p().autoCommit : true); + apiParameters.appendInfo(¶metersBuilder); readConcernArgs.appendInfo(¶metersBuilder); s << "parameters:" << parametersBuilder.obj().toString() << ","; @@ -1942,6 +1959,7 @@ void TransactionParticipant::Participant::_transactionInfoForLog( OperationContext* opCtx, const SingleThreadedLockStats* lockStats, TerminationCause terminationCause, + APIParameters apiParameters, repl::ReadConcernArgs readConcernArgs, logv2::DynamicAttributes* pAttrs) const { invariant(lockStats); @@ -1955,6 +1973,7 @@ void TransactionParticipant::Participant::_transactionInfoForLog( parametersBuilder.append("txnNumber", o().activeTxnNumber); parametersBuilder.append("autocommit", p().autoCommit ? *p().autoCommit : true); + apiParameters.appendInfo(¶metersBuilder); readConcernArgs.appendInfo(¶metersBuilder); pAttrs->add("parameters", parametersBuilder.obj()); @@ -2009,6 +2028,7 @@ BSONObj TransactionParticipant::Participant::_transactionInfoBSONForLog( OperationContext* opCtx, const SingleThreadedLockStats* lockStats, TerminationCause terminationCause, + APIParameters apiParameters, repl::ReadConcernArgs readConcernArgs) const { invariant(lockStats); @@ -2021,6 +2041,7 @@ BSONObj TransactionParticipant::Participant::_transactionInfoBSONForLog( parametersBuilder.append("txnNumber", o().activeTxnNumber); parametersBuilder.append("autocommit", p().autoCommit ? *p().autoCommit : true); + apiParameters.appendInfo(¶metersBuilder); readConcernArgs.appendInfo(¶metersBuilder); BSONObjBuilder logLine; @@ -2085,6 +2106,7 @@ void TransactionParticipant::Participant::_logSlowTransaction( OperationContext* opCtx, const SingleThreadedLockStats* lockStats, TerminationCause terminationCause, + APIParameters apiParameters, repl::ReadConcernArgs readConcernArgs) { // Only log multi-document transactions. if (!o().txnState.isInRetryableWriteMode()) { @@ -2099,7 +2121,8 @@ void TransactionParticipant::Participant::_logSlowTransaction( Milliseconds(serverGlobalParams.slowMS)) .first) { logv2::DynamicAttributes attr; - _transactionInfoForLog(opCtx, lockStats, terminationCause, readConcernArgs, &attr); + _transactionInfoForLog( + opCtx, lockStats, terminationCause, apiParameters, readConcernArgs, &attr); LOGV2_OPTIONS(51802, {logv2::LogComponent::kTransaction}, "transaction", attr); } } |