diff options
author | Amirsaman Memaripour <amirsaman.memaripour@mongodb.com> | 2020-05-07 10:23:12 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-05-08 01:44:39 +0000 |
commit | a01e575c7f2811ee8c4d3b98ecb0230b1b991399 (patch) | |
tree | 19a09b7c4a8fbe62918d9a8947ee47753dece531 | |
parent | c25f75a8ce9f5dec80ba0c5bd868a6e98a80beca (diff) | |
download | mongo-a01e575c7f2811ee8c4d3b98ecb0230b1b991399.tar.gz |
SERVER-48007 Destroy ARS in establishCursors out of line
This commit delegates the destruction of the ARS instance in MultiStatementTransactionRequestsSender
to the opCtx baton to potentially move the cost off of the critical path.
-rw-r--r-- | src/mongo/s/multi_statement_transaction_requests_sender.cpp | 29 | ||||
-rw-r--r-- | src/mongo/s/multi_statement_transaction_requests_sender.h | 6 |
2 files changed, 25 insertions, 10 deletions
diff --git a/src/mongo/s/multi_statement_transaction_requests_sender.cpp b/src/mongo/s/multi_statement_transaction_requests_sender.cpp index c302ac28d2b..b3935f82910 100644 --- a/src/mongo/s/multi_statement_transaction_requests_sender.cpp +++ b/src/mongo/s/multi_statement_transaction_requests_sender.cpp @@ -31,6 +31,7 @@ #include "mongo/s/multi_statement_transaction_requests_sender.h" +#include "mongo/db/operation_context.h" #include "mongo/s/transaction_router.h" namespace mongo { @@ -80,25 +81,35 @@ MultiStatementTransactionRequestsSender::MultiStatementTransactionRequestsSender const ReadPreferenceSetting& readPreference, Shard::RetryPolicy retryPolicy) : _opCtx(opCtx), - _ars(opCtx, - std::move(executor), - dbName, - attachTxnDetails(opCtx, requests), - readPreference, - retryPolicy) {} + _ars(std::make_unique<AsyncRequestsSender>(opCtx, + std::move(executor), + dbName, + attachTxnDetails(opCtx, requests), + readPreference, + retryPolicy)) {} + +MultiStatementTransactionRequestsSender::~MultiStatementTransactionRequestsSender() { + invariant(_opCtx); + auto baton = _opCtx->getBaton(); + invariant(baton); + // Delegate the destruction of `_ars` to the `_opCtx` baton to potentially move the cost off of + // the critical path. The assumption is that postponing the destruction is safe so long as the + // `_opCtx` that corresponds to `_ars` remains alive. + baton->schedule([ars = std::move(_ars)](Status) mutable { ars.reset(); }); +} bool MultiStatementTransactionRequestsSender::done() { - return _ars.done(); + return _ars->done(); } AsyncRequestsSender::Response MultiStatementTransactionRequestsSender::next() { - const auto response = _ars.next(); + const auto response = _ars->next(); processReplyMetadata(_opCtx, response); return response; } void MultiStatementTransactionRequestsSender::stopRetrying() { - _ars.stopRetrying(); + _ars->stopRetrying(); } } // namespace mongo diff --git a/src/mongo/s/multi_statement_transaction_requests_sender.h b/src/mongo/s/multi_statement_transaction_requests_sender.h index 0d93d031b99..0934c1211ef 100644 --- a/src/mongo/s/multi_statement_transaction_requests_sender.h +++ b/src/mongo/s/multi_statement_transaction_requests_sender.h @@ -29,6 +29,8 @@ #pragma once +#include <memory> + #include "mongo/s/async_requests_sender.h" namespace mongo { @@ -53,6 +55,8 @@ public: const ReadPreferenceSetting& readPreference, Shard::RetryPolicy retryPolicy); + ~MultiStatementTransactionRequestsSender(); + bool done(); AsyncRequestsSender::Response next(); @@ -61,7 +65,7 @@ public: private: OperationContext* _opCtx; - AsyncRequestsSender _ars; + std::unique_ptr<AsyncRequestsSender> _ars; }; } // namespace mongo |