From: Yingxin Date: Wed, 17 Oct 2018 20:45:53 +0000 (+0800) Subject: crimson/net: connection closed during connecting X-Git-Tag: v14.1.0~862^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9b7d8ffd5ea53d57348ffa2d4c9f0edcd73973bd;p=ceph.git crimson/net: connection closed during connecting It is possible during `seastar::connect()`, the connection is marked closed (when SocketConnection::socket is unavailable), then `seastar::connect()` successfully returns a connected socket. Signed-off-by: Yingxin --- diff --git a/src/crimson/net/SocketConnection.cc b/src/crimson/net/SocketConnection.cc index 26bd1e491f30..c9eae3a94331 100644 --- a/src/crimson/net/SocketConnection.cc +++ b/src/crimson/net/SocketConnection.cc @@ -307,11 +307,17 @@ seastar::future<> SocketConnection::close() // cannot happen ceph_assert(false); } - state = state_t::closing; // close_ready become valid only after state is state_t::closing assert(!close_ready.valid()); - close_ready = socket->close().finally(std::move(cleanup)); + + if (socket) { + close_ready = socket->close().finally(std::move(cleanup)); + } else { + ceph_assert(state == state_t::connecting); + close_ready = seastar::now(); + } + state = state_t::closing; return close_ready.get_future(); } @@ -764,6 +770,11 @@ SocketConnection::start_connect(const entity_addr_t& _peer_addr, state = state_t::connecting; return seastar::connect(peer_addr.in4_addr()) .then([this](seastar::connected_socket fd) { + if (state == state_t::closing) { + fd.shutdown_input(); + fd.shutdown_output(); + throw std::system_error(make_error_code(error::connection_aborted)); + } socket.emplace(std::move(fd)); // read server's handshake header return socket->read(server_header_size);