]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/asok: disconnect client when shutdown
authorKefu Chai <kchai@redhat.com>
Sun, 16 Feb 2020 10:03:24 +0000 (18:03 +0800)
committerKefu Chai <kchai@redhat.com>
Sun, 16 Feb 2020 15:59:30 +0000 (23:59 +0800)
track the established connection as well, please note, the current asok
implementation only allows a single connection at the same time, even
though unix domain socket allows multiple concurrent clients. so there
is no need to track multiple clients at this moment.

Signed-off-by: Kefu Chai <kchai@redhat.com>
src/crimson/admin/admin_socket.cc
src/crimson/admin/admin_socket.h

index 57836fde1f42f2daf426b27d8a8357381e4a8646..d89a0918890c5ae494026159145d4dc16a43e7f7 100644 (file)
@@ -202,17 +202,6 @@ seastar::future<> AdminSocket::handle_client(seastar::input_stream<char>& in,
   }).discard_result();
 }
 
-namespace {
-struct connection_t {
-  seastar::connected_socket cs;
-  seastar::input_stream<char> input;
-  seastar::output_stream<char> output;
-  connection_t(seastar::connected_socket&& s) :
-    cs(std::move(s)), input(cs.input()), output(cs.output())
-  {}
-};
-}
-
 seastar::future<> AdminSocket::start(const std::string& path)
 {
   if (path.empty()) {
@@ -229,10 +218,16 @@ seastar::future<> AdminSocket::start(const std::string& path)
     [this] { return stop_gate.is_closed(); },
     [this] {
       return seastar::with_gate(stop_gate, [this] {
+        assert(!connected_sock.has_value());
         return server_sock->accept().then([this](seastar::accept_result acc) {
-          return seastar::do_with(connection_t{std::move(acc.connection)},
-            [this](auto& conn) mutable {
-            return handle_client(conn.input, conn.output);
+          connected_sock = std::move(acc.connection);
+          return seastar::do_with(connected_sock->input(),
+                                  connected_sock->output(),
+            [this](auto& input, auto& output) mutable {
+            return handle_client(input, output);
+          }).finally([this] {
+            assert(connected_sock.has_value());
+            connected_sock.reset();
           });
         }).handle_exception([this](auto ep) {
           if (!stop_gate.is_closed()) {
@@ -254,6 +249,12 @@ seastar::future<> AdminSocket::stop()
     return seastar::now();
   }
   server_sock->abort_accept();
+  server_sock.reset();
+  if (connected_sock) {
+    connected_sock->shutdown_input();
+    connected_sock->shutdown_output();
+    connected_sock.reset();
+  }
   return stop_gate.close();
 }
 
index 1b049aaeaf210800674754f29d3cf3dff71c8379..4b57b68ad40af04e8dd1e5254724b94661788df4 100644 (file)
@@ -138,6 +138,7 @@ class AdminSocket : public seastar::enable_lw_shared_from_this<AdminSocket> {
                         ceph::bufferlist& out) const;
 
   std::optional<seastar::server_socket> server_sock;
+  std::optional<seastar::connected_socket> connected_sock;
 
   /**
    * stopping incoming ASOK requests at shutdown