summaryrefslogtreecommitdiff
path: root/src/mongo/db/transaction_api.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/transaction_api.cpp')
-rw-r--r--src/mongo/db/transaction_api.cpp14
1 files changed, 10 insertions, 4 deletions
diff --git a/src/mongo/db/transaction_api.cpp b/src/mongo/db/transaction_api.cpp
index e0bc476ac8b..6af7f5b402b 100644
--- a/src/mongo/db/transaction_api.cpp
+++ b/src/mongo/db/transaction_api.cpp
@@ -103,10 +103,16 @@ StatusWith<CommitResult> SyncTransactionWithRetries::runNoThrow(OperationContext
return yieldStatus;
}
- auto txnResult = _txn->run(std::move(callback)).getNoThrow(opCtx);
+ auto txnFuture = _txn->run(std::move(callback));
+ auto txnResult = txnFuture.getNoThrow(opCtx);
+
// Cancel the source to guarantee the transaction will terminate if our opCtx was interrupted.
_source.cancel();
+ // Wait for transaction to complete before returning so variables referenced by its callback are
+ // guaranteed to be in scope even if the API caller's opCtx was interrupted.
+ txnFuture.wait();
+
// Post transaction processing, which must also happen inline.
OperationTimeTracker::get(opCtx)->updateOperationTime(_txn->getOperationTime());
repl::ReplClientInfo::forClient(opCtx->getClient())
@@ -268,7 +274,7 @@ ExecutorFuture<void> TransactionWithRetries::_bestEffortAbort() {
return _internalTxn->abort().thenRunOn(_executor).onError([this](Status abortStatus) {
LOGV2(5875900,
"Unable to abort internal transaction",
- "reason"_attr = abortStatus,
+ "reason"_attr = redact(abortStatus),
"txnInfo"_attr = _internalTxn->reportStateForLog());
});
}
@@ -531,8 +537,8 @@ Transaction::ErrorHandlingStep Transaction::handleError(const StatusWith<CommitR
LOGV2_DEBUG(5875905,
3,
"Internal transaction handling error",
- "error"_attr = swResult.isOK() ? swResult.getValue().getEffectiveStatus()
- : swResult.getStatus(),
+ "error"_attr = swResult.isOK() ? redact(swResult.getValue().getEffectiveStatus())
+ : redact(swResult.getStatus()),
"hasTransientTransactionErrorLabel"_attr =
_latestResponseHasTransientTransactionErrorLabel,
"txnInfo"_attr = _reportStateForLog(lg),