summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Mulrow <jack.mulrow@mongodb.com>2022-01-11 22:15:00 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-01-12 20:14:54 +0000
commit4994aec2764996ebd8f4747abe75e3c0ef396987 (patch)
treec92b13668c6e535dd3d57613e054a4566538df70
parent36d096e95aa193d08eb934987d6617b65cc1eadf (diff)
downloadmongo-4994aec2764996ebd8f4747abe75e3c0ef396987.tar.gz
SERVER-62435 Capture a strong reference to SEPTransactionClient in transaction API
-rw-r--r--src/mongo/db/transaction_api.cpp10
-rw-r--r--src/mongo/db/transaction_api.h11
-rw-r--r--src/mongo/db/transaction_api_test.cpp4
3 files changed, 13 insertions, 12 deletions
diff --git a/src/mongo/db/transaction_api.cpp b/src/mongo/db/transaction_api.cpp
index 8183ef768a4..f46ec5558e6 100644
--- a/src/mongo/db/transaction_api.cpp
+++ b/src/mongo/db/transaction_api.cpp
@@ -206,7 +206,7 @@ SemiFuture<BSONObj> SEPTransactionClient::runCommand(StringData dbName, BSONObj
auto opMsgRequest = OpMsgRequest::fromDBAndBody(dbName, cmdBuilder.obj());
auto requestMessage = opMsgRequest.serialize();
return sep->handleRequest(cancellableOpCtx.get(), requestMessage)
- .then([this](DbResponse dbResponse) {
+ .then([this, anchor = shared_from_this()](DbResponse dbResponse) {
auto reply = rpc::makeReply(&dbResponse.response)->getCommandReply().getOwned();
_hooks->runReplyHook(reply);
return reply;
@@ -218,7 +218,7 @@ SemiFuture<BatchedCommandResponse> SEPTransactionClient::runCRUDOp(
const BatchedCommandRequest& cmd, std::vector<StmtId> stmtIds) const {
return runCommand(cmd.getNS().db(), cmd.toBSON())
.thenRunOn(_executor)
- .then([this](BSONObj reply) {
+ .then([this, anchor = shared_from_this()](BSONObj reply) {
uassertStatusOK(getStatusFromCommandResult(reply));
BatchedCommandResponse response;
@@ -239,7 +239,7 @@ SemiFuture<std::vector<BSONObj>> SEPTransactionClient::exhaustiveFind(
cmd.getSingleBatch());
return runCommand(cmd.getDbName(), cmd.toBSON({}))
.thenRunOn(_executor)
- .then([this](BSONObj reply) {
+ .then([this, anchor = shared_from_this()](BSONObj reply) {
// Will throw if the response has a non OK top level status.
auto cursorResponse = uassertStatusOK(CursorResponse::parseFromBSON(reply));
return cursorResponse.releaseBatch();
@@ -250,7 +250,7 @@ SemiFuture<std::vector<BSONObj>> SEPTransactionClient::exhaustiveFind(
SemiFuture<CommitResult> Transaction::commit() {
return _commitOrAbort(NamespaceString::kAdminDb, CommitTransaction::kCommandName)
.thenRunOn(_executor)
- .then([this](BSONObj res) {
+ .then([](BSONObj res) {
auto wcErrorHolder = getWriteConcernErrorDetailFromBSONObj(res);
WriteConcernErrorDetail wcError;
if (wcErrorHolder) {
@@ -264,7 +264,7 @@ SemiFuture<CommitResult> Transaction::commit() {
SemiFuture<void> Transaction::abort() {
return _commitOrAbort(NamespaceString::kAdminDb, AbortTransaction::kCommandName)
.thenRunOn(_executor)
- .then([this](BSONObj res) {
+ .then([](BSONObj res) {
uassertStatusOK(getStatusFromCommandResult(res));
uassertStatusOK(getWriteConcernStatusFromCommandResult(res));
})
diff --git a/src/mongo/db/transaction_api.h b/src/mongo/db/transaction_api.h
index ab55cf47b51..d09d83fc214 100644
--- a/src/mongo/db/transaction_api.h
+++ b/src/mongo/db/transaction_api.h
@@ -126,7 +126,7 @@ public:
*/
TransactionWithRetries(OperationContext* opCtx,
ExecutorPtr executor,
- std::unique_ptr<TransactionClient> txnClient)
+ std::shared_ptr<TransactionClient> txnClient)
: _executor(executor),
_internalTxn(
std::make_unique<details::Transaction>(opCtx, executor, std::move(txnClient))) {}
@@ -174,7 +174,8 @@ namespace details {
* Default transaction client that runs given commands through the local process service entry
* point.
*/
-class SEPTransactionClient : public TransactionClient {
+class SEPTransactionClient : public TransactionClient,
+ public std::enable_shared_from_this<SEPTransactionClient> {
public:
SEPTransactionClient(OperationContext* opCtx, ExecutorPtr executor)
: _serviceContext(opCtx->getServiceContext()), _executor(executor) {
@@ -242,7 +243,7 @@ public:
Transaction(OperationContext* opCtx, ExecutorPtr executor)
: _initialOpCtx(opCtx),
_executor(executor),
- _txnClient(std::make_unique<SEPTransactionClient>(opCtx, executor)) {
+ _txnClient(std::make_shared<SEPTransactionClient>(opCtx, executor)) {
_primeTransaction(opCtx);
_txnClient->injectHooks(_makeTxnMetadataHooks());
}
@@ -252,7 +253,7 @@ public:
*/
Transaction(OperationContext* opCtx,
ExecutorPtr executor,
- std::unique_ptr<TransactionClient> txnClient)
+ std::shared_ptr<TransactionClient> txnClient)
: _initialOpCtx(opCtx), _executor(executor), _txnClient(std::move(txnClient)) {
_primeTransaction(opCtx);
_txnClient->injectHooks(_makeTxnMetadataHooks());
@@ -331,7 +332,7 @@ private:
OperationContext* const _initialOpCtx;
ExecutorPtr _executor;
- std::unique_ptr<TransactionClient> _txnClient;
+ std::shared_ptr<TransactionClient> _txnClient;
bool _latestResponseHasTransientTransactionErrorLabel{false};
diff --git a/src/mongo/db/transaction_api_test.cpp b/src/mongo/db/transaction_api_test.cpp
index 7c71de56aec..266d0c61847 100644
--- a/src/mongo/db/transaction_api_test.cpp
+++ b/src/mongo/db/transaction_api_test.cpp
@@ -165,7 +165,7 @@ protected:
_opCtx = makeOperationContext();
- auto mockClient = std::make_unique<txn_api::details::MockTransactionClient>();
+ auto mockClient = std::make_shared<txn_api::details::MockTransactionClient>();
_mockClient = mockClient.get();
_txnWithRetries = std::make_shared<txn_api::TransactionWithRetries>(
opCtx(), InlineQueuedCountingExecutor::make(), std::move(mockClient));
@@ -184,7 +184,7 @@ protected:
}
void resetTxnWithRetries() {
- auto mockClient = std::make_unique<txn_api::details::MockTransactionClient>();
+ auto mockClient = std::make_shared<txn_api::details::MockTransactionClient>();
_mockClient = mockClient.get();
_txnWithRetries = std::make_shared<txn_api::TransactionWithRetries>(
opCtx(), InlineQueuedCountingExecutor::make(), std::move(mockClient));