diff options
| author | Patrick Freed <patrick.freed@mongodb.com> | 2024-02-21 15:04:28 -0500 |
|---|---|---|
| committer | MongoDB Bot <mongo-bot@mongodb.com> | 2024-02-21 20:13:46 +0000 |
| commit | 52a7871d8033a99acba71c9c995f9e8bb6f4e0bf (patch) | |
| tree | 44145dac214f517ceda9857f87d38f5c545c9aa6 | |
| parent | 2063be6618b583dff5a4d5ac72e9b10638b3f9ec (diff) | |
SERVER-86694 Fix crash when AsioTransportLayer is shut down between setup and start (#19073) (#19114)r7.3.0-rc3
GitOrigin-RevId: 5eff1aa2d23b15324f92a8f596175ae17c56a409
| -rw-r--r-- | src/mongo/transport/asio/asio_transport_layer.cpp | 19 | ||||
| -rw-r--r-- | src/mongo/transport/asio/asio_transport_layer_test.cpp | 14 | ||||
| -rw-r--r-- | src/mongo/transport/grpc/grpc_transport_layer_impl.cpp | 4 | ||||
| -rw-r--r-- | src/mongo/transport/session_manager.h | 5 | ||||
| -rw-r--r-- | src/mongo/transport/session_manager_common.h | 3 | ||||
| -rw-r--r-- | src/mongo/transport/session_manager_noop.h | 3 | ||||
| -rw-r--r-- | src/mongo/transport/test_fixtures.h | 4 | ||||
| -rw-r--r-- | src/mongo/util/net/ssl_manager_test.cpp | 4 |
8 files changed, 19 insertions, 37 deletions
diff --git a/src/mongo/transport/asio/asio_transport_layer.cpp b/src/mongo/transport/asio/asio_transport_layer.cpp index 81ef2e6f487..4a6ea5a8263 100644 --- a/src/mongo/transport/asio/asio_transport_layer.cpp +++ b/src/mongo/transport/asio/asio_transport_layer.cpp @@ -1215,18 +1215,17 @@ Status AsioTransportLayer::start() { return ShutdownStatus; } - if (_sessionManager) { - uassertStatusOK(_sessionManager->start()); - } - - if (_listenerOptions.isIngress() && _listener.state == Listener::State::kNew) { - invariant(_sessionManager); - _listener.thread = stdx::thread([this] { _runListener(); }); - _listener.cv.wait(lk, [&] { return _listener.state != Listener::State::kNew; }); - return Status::OK(); + if (_listenerOptions.isIngress()) { + // Only start the listener thread if the TL wasn't shut down before start() was invoked. + if (_listener.state == Listener::State::kNew) { + invariant(_sessionManager); + _listener.thread = stdx::thread([this] { _runListener(); }); + _listener.cv.wait(lk, [&] { return _listener.state != Listener::State::kNew; }); + } + } else { + invariant(_acceptorRecords.empty()); } - invariant(_acceptorRecords.empty()); return Status::OK(); } diff --git a/src/mongo/transport/asio/asio_transport_layer_test.cpp b/src/mongo/transport/asio/asio_transport_layer_test.cpp index 7011c2d9052..7595022c4fe 100644 --- a/src/mongo/transport/asio/asio_transport_layer_test.cpp +++ b/src/mongo/transport/asio/asio_transport_layer_test.cpp @@ -342,6 +342,16 @@ TEST(AsioTransportLayer, TCPResetAfterConnectionIsSilentlySwallowed) { ASSERT_EQ(sessionsCreated.load(), 0); } +TEST(AsioTransportLayer, StopAcceptingSessionsBeforeStart) { + auto sm = std::make_unique<test::MockSessionManager>(); + auto tla = std::make_unique<AsioTransportLayer>(defaultTLAOptions(), std::move(sm)); + ON_BLOCK_EXIT([&] { tla->shutdown(); }); + + ASSERT_OK(tla->setup()); + tla->stopAcceptingSessions(); + ASSERT_OK(tla->start()); +} + #ifdef __linux__ /** * Test that the server successfully captures the TCP socket queue depth, and places the value both @@ -969,10 +979,6 @@ public: _join(); } - Status start() override { - return Status::OK(); - } - void startSession(std::shared_ptr<Session> session) override { stdx::lock_guard lk{_mutex}; _sessions.push_back(session); diff --git a/src/mongo/transport/grpc/grpc_transport_layer_impl.cpp b/src/mongo/transport/grpc/grpc_transport_layer_impl.cpp index de52d1f2722..def8acc5269 100644 --- a/src/mongo/transport/grpc/grpc_transport_layer_impl.cpp +++ b/src/mongo/transport/grpc/grpc_transport_layer_impl.cpp @@ -192,10 +192,6 @@ Status GRPCTransportLayerImpl::start() { "tlsFIPSMode is not supported when gRPC mode is enabled", !sslGlobalParams.sslFIPSMode); - if (_sessionManager) { - uassertStatusOK(_sessionManager->start()); - } - if (_server) { invariant(_sessionManager); _server->start(); diff --git a/src/mongo/transport/session_manager.h b/src/mongo/transport/session_manager.h index 0ade15b12d6..f72285a6f8a 100644 --- a/src/mongo/transport/session_manager.h +++ b/src/mongo/transport/session_manager.h @@ -78,11 +78,6 @@ public: virtual void endAllSessions(Client::TagMask tags) = 0; /** - * Starts the session manager. - */ - virtual Status start() = 0; - - /** * Shuts down the session manager. */ virtual bool shutdown(Milliseconds timeout) = 0; diff --git a/src/mongo/transport/session_manager_common.h b/src/mongo/transport/session_manager_common.h index 114ba1217ea..24831bc8715 100644 --- a/src/mongo/transport/session_manager_common.h +++ b/src/mongo/transport/session_manager_common.h @@ -60,9 +60,6 @@ public: void endSessionByClient(Client* client) override; void endAllSessionsNoTagMask(); - Status start() override { - return Status::OK(); - } bool shutdown(Milliseconds timeout) override; bool shutdownAndWait(Milliseconds timeout); bool waitForNoSessions(Milliseconds timeout); diff --git a/src/mongo/transport/session_manager_noop.h b/src/mongo/transport/session_manager_noop.h index 94161b8e4e7..6831c7a079a 100644 --- a/src/mongo/transport/session_manager_noop.h +++ b/src/mongo/transport/session_manager_noop.h @@ -41,9 +41,6 @@ public: void startSession(std::shared_ptr<transport::Session> session) override {} void endAllSessions(Client::TagMask tags) override {} void endSessionByClient(Client* client) override {} - Status start() override { - return Status::OK(); - } bool shutdown(Milliseconds timeout) override { return true; } diff --git a/src/mongo/transport/test_fixtures.h b/src/mongo/transport/test_fixtures.h index 34060e5f560..0d7040d9379 100644 --- a/src/mongo/transport/test_fixtures.h +++ b/src/mongo/transport/test_fixtures.h @@ -183,10 +183,6 @@ public: _join(); } - Status start() override { - return Status::OK(); - } - void startSession(std::shared_ptr<transport::Session> session) override { LOGV2(6109510, "Accepted connection", "remote"_attr = session->remote()); auto& newSession = [&]() -> SessionThread& { diff --git a/src/mongo/util/net/ssl_manager_test.cpp b/src/mongo/util/net/ssl_manager_test.cpp index ddefa42068a..adf74d7fc5f 100644 --- a/src/mongo/util/net/ssl_manager_test.cpp +++ b/src/mongo/util/net/ssl_manager_test.cpp @@ -77,10 +77,6 @@ public: old_sessions.clear(); } - Status start() override { - return Status::OK(); - } - bool shutdown(Milliseconds timeout) override { return true; } |
