diff options
author | Jack Mulrow <jack.mulrow@mongodb.com> | 2022-01-11 22:15:00 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-01-12 20:14:54 +0000 |
commit | 4994aec2764996ebd8f4747abe75e3c0ef396987 (patch) | |
tree | c92b13668c6e535dd3d57613e054a4566538df70 | |
parent | 36d096e95aa193d08eb934987d6617b65cc1eadf (diff) | |
download | mongo-4994aec2764996ebd8f4747abe75e3c0ef396987.tar.gz |
SERVER-62435 Capture a strong reference to SEPTransactionClient in transaction API
-rw-r--r-- | src/mongo/db/transaction_api.cpp | 10 | ||||
-rw-r--r-- | src/mongo/db/transaction_api.h | 11 | ||||
-rw-r--r-- | src/mongo/db/transaction_api_test.cpp | 4 |
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)); |