diff options
author | Vojislav Stojkovic <vojislav.stojkovic@mongodb.com> | 2022-09-16 14:59:02 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-09-16 17:08:17 +0000 |
commit | f81093713522be99a93571f0f3e5f0e16c4db600 (patch) | |
tree | e30d0a11a95b6056a02f5eda4f002b8bc97c1ba9 | |
parent | 2514cb0721a0df59601f3ff264a9a03d5015db71 (diff) | |
download | mongo-f81093713522be99a93571f0f3e5f0e16c4db600.tar.gz |
SERVER-69584 Pass ConnectionMetrics by shared_ptr
-rw-r--r-- | src/mongo/client/async_client.cpp | 2 | ||||
-rw-r--r-- | src/mongo/client/async_client.h | 2 | ||||
-rw-r--r-- | src/mongo/executor/connection_pool_tl.cpp | 14 | ||||
-rw-r--r-- | src/mongo/transport/transport_layer.h | 2 | ||||
-rw-r--r-- | src/mongo/transport/transport_layer_asio.cpp | 2 | ||||
-rw-r--r-- | src/mongo/transport/transport_layer_asio.h | 2 | ||||
-rw-r--r-- | src/mongo/transport/transport_layer_asio_integration_test.cpp | 22 | ||||
-rw-r--r-- | src/mongo/transport/transport_layer_manager.cpp | 2 | ||||
-rw-r--r-- | src/mongo/transport/transport_layer_manager.h | 2 | ||||
-rw-r--r-- | src/mongo/transport/transport_layer_mock.cpp | 2 | ||||
-rw-r--r-- | src/mongo/transport/transport_layer_mock.h | 2 |
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; |