summaryrefslogtreecommitdiff
path: root/src/mongo/db/transaction_participant.cpp
diff options
context:
space:
mode:
authorXueruiFa <xuerui.fa@mongodb.com>2020-08-19 15:52:12 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-08-19 20:18:54 +0000
commitd3169bf266e409f68784aa512511c680b5cc6aa4 (patch)
tree3d9a546e87f5cc5c0cde61329aa73af10cf9f373 /src/mongo/db/transaction_participant.cpp
parent45a9e0a76e4a9ef995b3490d74610cab98dbcc0a (diff)
downloadmongo-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.cpp25
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(&parametersBuilder);
readConcernArgs.appendInfo(&parametersBuilder);
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(&parametersBuilder);
readConcernArgs.appendInfo(&parametersBuilder);
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(&parametersBuilder);
readConcernArgs.appendInfo(&parametersBuilder);
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);
}
}