summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVojislav Stojkovic <vojislav.stojkovic@mongodb.com>2022-09-16 14:59:02 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-09-16 17:08:17 +0000
commitf81093713522be99a93571f0f3e5f0e16c4db600 (patch)
treee30d0a11a95b6056a02f5eda4f002b8bc97c1ba9
parent2514cb0721a0df59601f3ff264a9a03d5015db71 (diff)
downloadmongo-f81093713522be99a93571f0f3e5f0e16c4db600.tar.gz
SERVER-69584 Pass ConnectionMetrics by shared_ptr
-rw-r--r--src/mongo/client/async_client.cpp2
-rw-r--r--src/mongo/client/async_client.h2
-rw-r--r--src/mongo/executor/connection_pool_tl.cpp14
-rw-r--r--src/mongo/transport/transport_layer.h2
-rw-r--r--src/mongo/transport/transport_layer_asio.cpp2
-rw-r--r--src/mongo/transport/transport_layer_asio.h2
-rw-r--r--src/mongo/transport/transport_layer_asio_integration_test.cpp22
-rw-r--r--src/mongo/transport/transport_layer_manager.cpp2
-rw-r--r--src/mongo/transport/transport_layer_manager.h2
-rw-r--r--src/mongo/transport/transport_layer_mock.cpp2
-rw-r--r--src/mongo/transport/transport_layer_mock.h2
11 files changed, 33 insertions, 21 deletions
diff --git a/src/mongo/client/async_client.cpp b/src/mongo/client/async_client.cpp
index b17d83b14c2..26e2f488ed2 100644
--- a/src/mongo/client/async_client.cpp
+++ b/src/mongo/client/async_client.cpp
@@ -67,7 +67,7 @@ Future<AsyncDBClient::Handle> AsyncDBClient::connect(
ServiceContext* const context,
transport::ReactorHandle reactor,
Milliseconds timeout,
- ConnectionMetrics* connectionMetrics,
+ std::shared_ptr<ConnectionMetrics> connectionMetrics,
std::shared_ptr<const transport::SSLConnectionContext> transientSSLContext) {
auto tl = context->getTransportLayer();
return tl
diff --git a/src/mongo/client/async_client.h b/src/mongo/client/async_client.h
index fcae5064069..7b7bcc39506 100644
--- a/src/mongo/client/async_client.h
+++ b/src/mongo/client/async_client.h
@@ -61,7 +61,7 @@ public:
ServiceContext* context,
transport::ReactorHandle reactor,
Milliseconds timeout,
- ConnectionMetrics* connectionMetrics, // must remain valid until the future is ready
+ std::shared_ptr<ConnectionMetrics> connectionMetrics,
std::shared_ptr<const transport::SSLConnectionContext> transientSSLContext = nullptr);
Future<executor::RemoteCommandResponse> runCommandRequest(
diff --git a/src/mongo/executor/connection_pool_tl.cpp b/src/mongo/executor/connection_pool_tl.cpp
index c27d7604691..f4c7ff1f900 100644
--- a/src/mongo/executor/connection_pool_tl.cpp
+++ b/src/mongo/executor/connection_pool_tl.cpp
@@ -329,6 +329,11 @@ private:
void TLConnection::setup(Milliseconds timeout, SetupCallback cb, std::string instanceName) {
auto anchor = shared_from_this();
+ // Create a shared_ptr to _connMetrics that shares the ownership information with the
+ // anchor. We want to keep this TLConnection instance alive as long as the shared_ptr
+ // to _connMetrics is in use.
+ std::shared_ptr<ConnectionMetrics> connMetricsAnchor{anchor, &_connMetrics};
+
auto pf = makePromiseFuture<void>();
auto handler = std::make_shared<TimeoutHandler>(std::move(pf.promise));
std::move(pf.future).thenRunOn(_reactor).getAsync(
@@ -361,8 +366,13 @@ void TLConnection::setup(Milliseconds timeout, SetupCallback cb, std::string ins
// For transient connections, only use X.509 auth.
auto isMasterHook = std::make_shared<TLConnectionSetupHook>(_onConnectHook, x509AuthOnly);
- AsyncDBClient::connect(
- _peer, _sslMode, _serviceContext, _reactor, timeout, &_connMetrics, _transientSSLContext)
+ AsyncDBClient::connect(_peer,
+ _sslMode,
+ _serviceContext,
+ _reactor,
+ timeout,
+ connMetricsAnchor,
+ _transientSSLContext)
.thenRunOn(_reactor)
.onError([](StatusWith<AsyncDBClient::Handle> swc) -> StatusWith<AsyncDBClient::Handle> {
return Status(ErrorCodes::HostUnreachable, swc.getStatus().reason());
diff --git a/src/mongo/transport/transport_layer.h b/src/mongo/transport/transport_layer.h
index 9a9037c1890..24afafe1f01 100644
--- a/src/mongo/transport/transport_layer.h
+++ b/src/mongo/transport/transport_layer.h
@@ -99,7 +99,7 @@ public:
ConnectSSLMode sslMode,
const ReactorHandle& reactor,
Milliseconds timeout,
- ConnectionMetrics* connectionMetrics, // must remain valid until the future is ready
+ std::shared_ptr<ConnectionMetrics> connectionMetrics,
std::shared_ptr<const SSLConnectionContext> transientSSLContext) = 0;
/**
diff --git a/src/mongo/transport/transport_layer_asio.cpp b/src/mongo/transport/transport_layer_asio.cpp
index 2d056e6c71b..2f1b90095d6 100644
--- a/src/mongo/transport/transport_layer_asio.cpp
+++ b/src/mongo/transport/transport_layer_asio.cpp
@@ -761,7 +761,7 @@ Future<SessionHandle> TransportLayerASIO::asyncConnect(
ConnectSSLMode sslMode,
const ReactorHandle& reactor,
Milliseconds timeout,
- ConnectionMetrics* connectionMetrics,
+ std::shared_ptr<ConnectionMetrics> connectionMetrics,
std::shared_ptr<const SSLConnectionContext> transientSSLContext) {
invariant(connectionMetrics);
connectionMetrics->onConnectionStarted();
diff --git a/src/mongo/transport/transport_layer_asio.h b/src/mongo/transport/transport_layer_asio.h
index 9d84cd7c9bc..797cabb5ba6 100644
--- a/src/mongo/transport/transport_layer_asio.h
+++ b/src/mongo/transport/transport_layer_asio.h
@@ -187,7 +187,7 @@ public:
ConnectSSLMode sslMode,
const ReactorHandle& reactor,
Milliseconds timeout,
- ConnectionMetrics* connectionMetrics,
+ std::shared_ptr<ConnectionMetrics> connectionMetrics,
std::shared_ptr<const SSLConnectionContext> transientSSLContext = nullptr) final;
Status setup() final;
diff --git a/src/mongo/transport/transport_layer_asio_integration_test.cpp b/src/mongo/transport/transport_layer_asio_integration_test.cpp
index 1256f3526c5..912065c8821 100644
--- a/src/mongo/transport/transport_layer_asio_integration_test.cpp
+++ b/src/mongo/transport/transport_layer_asio_integration_test.cpp
@@ -30,6 +30,8 @@
#include "mongo/platform/basic.h"
+#include <memory>
+
#include "mongo/client/async_client.h"
#include "mongo/client/connection_string.h"
#include "mongo/db/client.h"
@@ -117,10 +119,10 @@ TEST(TransportLayerASIO, ShortReadsAndWritesWork) {
thread.join();
});
- ConnectionMetrics metrics{sc->getFastClockSource()};
+ auto metrics = std::make_shared<ConnectionMetrics>(sc->getFastClockSource());
AsyncDBClient::Handle handle =
AsyncDBClient::connect(
- server, transport::kGlobalSSLMode, sc, reactor, Milliseconds::max(), &metrics)
+ server, transport::kGlobalSSLMode, sc, reactor, Milliseconds::max(), metrics)
.get();
handle->initWireVersion(__FILE__, nullptr).get();
@@ -153,9 +155,9 @@ TEST(TransportLayerASIO, asyncConnectTimeoutCleansUpSocket) {
});
FailPointEnableBlock fp("transportLayerASIOasyncConnectTimesOut");
- ConnectionMetrics metrics{sc->getFastClockSource()};
+ auto metrics = std::make_shared<ConnectionMetrics>(sc->getFastClockSource());
auto client = AsyncDBClient::connect(
- server, transport::kGlobalSSLMode, sc, reactor, Milliseconds{500}, &metrics)
+ server, transport::kGlobalSSLMode, sc, reactor, Milliseconds{500}, metrics)
.getNoThrow();
ASSERT_EQ(client.getStatus(), ErrorCodes::NetworkTimeout);
}
@@ -173,10 +175,10 @@ TEST(TransportLayerASIO, exhaustIsMasterShouldReceiveMultipleReplies) {
thread.join();
});
- ConnectionMetrics metrics{sc->getFastClockSource()};
+ auto metrics = std::make_shared<ConnectionMetrics>(sc->getFastClockSource());
AsyncDBClient::Handle handle =
AsyncDBClient::connect(
- server, transport::kGlobalSSLMode, sc, reactor, Milliseconds::max(), &metrics)
+ server, transport::kGlobalSSLMode, sc, reactor, Milliseconds::max(), metrics)
.get();
handle->initWireVersion(__FILE__, nullptr).get();
@@ -257,17 +259,17 @@ TEST(TransportLayerASIO, exhaustIsMasterShouldStopOnFailure) {
thread.join();
});
- ConnectionMetrics masterMetrics{sc->getFastClockSource()};
+ auto masterMetrics = std::make_shared<ConnectionMetrics>(sc->getFastClockSource());
AsyncDBClient::Handle isMasterHandle =
AsyncDBClient::connect(
- server, transport::kGlobalSSLMode, sc, reactor, Milliseconds::max(), &masterMetrics)
+ server, transport::kGlobalSSLMode, sc, reactor, Milliseconds::max(), masterMetrics)
.get();
isMasterHandle->initWireVersion(__FILE__, nullptr).get();
- ConnectionMetrics failpointMetrics{sc->getFastClockSource()};
+ auto failpointMetrics = std::make_shared<ConnectionMetrics>(sc->getFastClockSource());
AsyncDBClient::Handle failpointHandle =
AsyncDBClient::connect(
- server, transport::kGlobalSSLMode, sc, reactor, Milliseconds::max(), &failpointMetrics)
+ server, transport::kGlobalSSLMode, sc, reactor, Milliseconds::max(), failpointMetrics)
.get();
failpointHandle->initWireVersion(__FILE__, nullptr).get();
diff --git a/src/mongo/transport/transport_layer_manager.cpp b/src/mongo/transport/transport_layer_manager.cpp
index 076a910edbd..7b2468a8848 100644
--- a/src/mongo/transport/transport_layer_manager.cpp
+++ b/src/mongo/transport/transport_layer_manager.cpp
@@ -76,7 +76,7 @@ Future<SessionHandle> TransportLayerManager::asyncConnect(
ConnectSSLMode sslMode,
const ReactorHandle& reactor,
Milliseconds timeout,
- ConnectionMetrics* connectionMetrics,
+ std::shared_ptr<ConnectionMetrics> connectionMetrics,
std::shared_ptr<const SSLConnectionContext> transientSSLContext) {
return _tls.front()->asyncConnect(
peer, sslMode, reactor, timeout, connectionMetrics, transientSSLContext);
diff --git a/src/mongo/transport/transport_layer_manager.h b/src/mongo/transport/transport_layer_manager.h
index 8964d3ddbc4..750712b2811 100644
--- a/src/mongo/transport/transport_layer_manager.h
+++ b/src/mongo/transport/transport_layer_manager.h
@@ -75,7 +75,7 @@ public:
ConnectSSLMode sslMode,
const ReactorHandle& reactor,
Milliseconds timeout,
- ConnectionMetrics* connectionMetrics,
+ std::shared_ptr<ConnectionMetrics> connectionMetrics,
std::shared_ptr<const SSLConnectionContext> transientSSLContext = nullptr) override;
Status start() override;
diff --git a/src/mongo/transport/transport_layer_mock.cpp b/src/mongo/transport/transport_layer_mock.cpp
index 928cb91ac4d..e601ad97573 100644
--- a/src/mongo/transport/transport_layer_mock.cpp
+++ b/src/mongo/transport/transport_layer_mock.cpp
@@ -75,7 +75,7 @@ Future<SessionHandle> TransportLayerMock::asyncConnect(
ConnectSSLMode sslMode,
const ReactorHandle& reactor,
Milliseconds timeout,
- ConnectionMetrics* connectionMetrics,
+ std::shared_ptr<ConnectionMetrics> connectionMetrics,
std::shared_ptr<const SSLConnectionContext> transientSSLContext) {
MONGO_UNREACHABLE;
}
diff --git a/src/mongo/transport/transport_layer_mock.h b/src/mongo/transport/transport_layer_mock.h
index fd1ed4fe57b..18870813b0b 100644
--- a/src/mongo/transport/transport_layer_mock.h
+++ b/src/mongo/transport/transport_layer_mock.h
@@ -67,7 +67,7 @@ public:
ConnectSSLMode sslMode,
const ReactorHandle& reactor,
Milliseconds timeout,
- ConnectionMetrics* connectionMetrics,
+ std::shared_ptr<ConnectionMetrics> connectionMetrics,
std::shared_ptr<const SSLConnectionContext> transientSSLContext = nullptr) override;
Status setup() override;