summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Freed <patrick.freed@mongodb.com>2024-02-21 15:04:28 -0500
committerMongoDB Bot <mongo-bot@mongodb.com>2024-02-21 20:13:46 +0000
commit52a7871d8033a99acba71c9c995f9e8bb6f4e0bf (patch)
tree44145dac214f517ceda9857f87d38f5c545c9aa6
parent2063be6618b583dff5a4d5ac72e9b10638b3f9ec (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.cpp19
-rw-r--r--src/mongo/transport/asio/asio_transport_layer_test.cpp14
-rw-r--r--src/mongo/transport/grpc/grpc_transport_layer_impl.cpp4
-rw-r--r--src/mongo/transport/session_manager.h5
-rw-r--r--src/mongo/transport/session_manager_common.h3
-rw-r--r--src/mongo/transport/session_manager_noop.h3
-rw-r--r--src/mongo/transport/test_fixtures.h4
-rw-r--r--src/mongo/util/net/ssl_manager_test.cpp4
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;
}