From: Samuel Just Date: Thu, 30 May 2019 00:31:59 +0000 (-0700) Subject: crimson/net/SocketMessenger: wait for accepter thread to die on shutdown X-Git-Tag: v15.1.0~2580^2~12 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=212593dac5caad712ab3d793135dddc734185010;p=ceph-ci.git crimson/net/SocketMessenger: wait for accepter thread to die on shutdown Otherwise, it ends up trying to operator<< *this after it's been deleted. Signed-off-by: Samuel Just --- diff --git a/src/crimson/net/SocketMessenger.cc b/src/crimson/net/SocketMessenger.cc index 8c1886fef68..343c5532d51 100644 --- a/src/crimson/net/SocketMessenger.cc +++ b/src/crimson/net/SocketMessenger.cc @@ -142,6 +142,7 @@ void SocketMessenger::do_bind(const entity_addrvec_t& addrs) seastar::future<> SocketMessenger::do_start(Dispatcher *disp) { dispatcher = disp; + started = true; // start listening if bind() was called if (listener) { @@ -164,9 +165,10 @@ seastar::future<> SocketMessenger::do_start(Dispatcher *disp) if (e.code() != error::connection_aborted) { logger().error("{} unexpected error during accept: {}", *this, e); } - }); + }).then([this] () { return accepting_complete.set_value(); }); + } else { + accepting_complete.set_value(); } - return seastar::now(); } @@ -184,6 +186,10 @@ SocketMessenger::do_connect(const entity_addr_t& peer_addr, const entity_type_t& seastar::future<> SocketMessenger::do_shutdown() { + if (!started) { + return seastar::now(); + } + if (listener) { listener->abort_accept(); } @@ -195,6 +201,8 @@ seastar::future<> SocketMessenger::do_shutdown() return seastar::parallel_for_each(connections, [] (auto conn) { return conn.second->close(); }); + }).then([this] { + return accepting_complete.get_shared_future(); }).finally([this] { ceph_assert(connections.empty()); }); diff --git a/src/crimson/net/SocketMessenger.h b/src/crimson/net/SocketMessenger.h index 6903d26dca7..db5b94be284 100644 --- a/src/crimson/net/SocketMessenger.h +++ b/src/crimson/net/SocketMessenger.h @@ -20,6 +20,7 @@ #include #include #include +#include #include "Messenger.h" #include "SocketConnection.h" @@ -44,6 +45,9 @@ class SocketMessenger final : public Messenger, public seastar::peering_sharded_ seastar::socket_address paddr); void do_bind(const entity_addrvec_t& addr); + + bool started = false; + seastar::shared_promise<> accepting_complete; seastar::future<> do_start(Dispatcher *disp); seastar::foreign_ptr do_connect(const entity_addr_t& peer_addr, const entity_type_t& peer_type);