]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/net/SocketMessenger: wait for accepter thread to die on shutdown
authorSamuel Just <sjust@redhat.com>
Thu, 30 May 2019 00:31:59 +0000 (17:31 -0700)
committerSamuel Just <sjust@redhat.com>
Fri, 31 May 2019 21:05:44 +0000 (14:05 -0700)
Otherwise, it ends up trying to operator<< *this after it's been
deleted.

Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/net/SocketMessenger.cc
src/crimson/net/SocketMessenger.h

index 8c1886fef68d823035f9f96a3580c2215078c876..343c5532d51cbd1830a22f8b4c75bbc5f06502a6 100644 (file)
@@ -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());
     });
index 6903d26dca75c47bf0a62e9b787a0c50ca7d4439..db5b94be2848cf4cc4ccab3eabdbb7ba43819ba5 100644 (file)
@@ -20,6 +20,7 @@
 #include <seastar/core/gate.hh>
 #include <seastar/core/reactor.hh>
 #include <seastar/core/sharded.hh>
+#include <seastar/core/shared_future.hh>
 
 #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<ConnectionRef> do_connect(const entity_addr_t& peer_addr,
                                                  const entity_type_t& peer_type);