summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmirsaman Memaripour <amirsaman.memaripour@mongodb.com>2020-05-07 10:23:12 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-05-08 01:44:39 +0000
commita01e575c7f2811ee8c4d3b98ecb0230b1b991399 (patch)
tree19a09b7c4a8fbe62918d9a8947ee47753dece531
parentc25f75a8ce9f5dec80ba0c5bd868a6e98a80beca (diff)
downloadmongo-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.cpp29
-rw-r--r--src/mongo/s/multi_statement_transaction_requests_sender.h6
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