From: Kefu Chai Date: Sun, 16 Feb 2020 10:03:24 +0000 (+0800) Subject: crimson/asok: disconnect client when shutdown X-Git-Tag: v15.1.1~398^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=15e31737a52932e657606f917b83a6529051c89f;p=ceph-ci.git crimson/asok: disconnect client when shutdown 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 --- diff --git a/src/crimson/admin/admin_socket.cc b/src/crimson/admin/admin_socket.cc index 57836fde1f4..d89a0918890 100644 --- a/src/crimson/admin/admin_socket.cc +++ b/src/crimson/admin/admin_socket.cc @@ -202,17 +202,6 @@ seastar::future<> AdminSocket::handle_client(seastar::input_stream& in, }).discard_result(); } -namespace { -struct connection_t { - seastar::connected_socket cs; - seastar::input_stream input; - seastar::output_stream 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(); } diff --git a/src/crimson/admin/admin_socket.h b/src/crimson/admin/admin_socket.h index 1b049aaeaf2..4b57b68ad40 100644 --- a/src/crimson/admin/admin_socket.h +++ b/src/crimson/admin/admin_socket.h @@ -138,6 +138,7 @@ class AdminSocket : public seastar::enable_lw_shared_from_this { ceph::bufferlist& out) const; std::optional server_sock; + std::optional connected_sock; /** * stopping incoming ASOK requests at shutdown