From: Yingxin Cheng Date: Wed, 7 Aug 2019 15:20:49 +0000 (+0800) Subject: crimson/net: allow connecting state reentrant X-Git-Tag: v15.1.0~1910^2~11 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=babc9c24fd1894219a03ae27522069e311141ead;p=ceph-ci.git crimson/net: allow connecting state reentrant Signed-off-by: Yingxin Cheng --- diff --git a/src/crimson/net/ProtocolV2.cc b/src/crimson/net/ProtocolV2.cc index 63d682afd36..0c1ded6b1cc 100644 --- a/src/crimson/net/ProtocolV2.cc +++ b/src/crimson/net/ProtocolV2.cc @@ -843,6 +843,9 @@ ProtocolV2::client_reconnect() void ProtocolV2::execute_connecting() { trigger_state(state_t::CONNECTING, write_state_t::delay, true); + if (socket) { + socket->shutdown(); + } seastar::with_gate(pending_dispatch, [this] { // we don't know my socket_port yet conn.set_ephemeral_port(0, SocketConnection::side_t::none); @@ -860,16 +863,30 @@ void ProtocolV2::execute_connecting() logger().debug("{} UPDATE: gs={}, cc={} for connect", conn, global_seq, client_cookie); } + + return wait_write_exit(); + }).then([this] { + if (unlikely(state != state_t::CONNECTING)) { + logger().debug("{} triggered {} before Socket::connect()", + conn, get_state_name(state)); + abort_protocol(); + } + if (socket) { + with_gate(pending_dispatch, [this, sock = std::move(socket)] () mutable { + return sock->close().then([sock = std::move(sock)] {}); + }); + } return Socket::connect(conn.peer_addr); }).then([this](SocketFRef sock) { logger().debug("{} socket connected", conn); - socket = std::move(sock); - if (state == state_t::CLOSING) { - return socket->close().then([this] { - logger().warn("{} is closed during Socket::connect()", conn); + if (unlikely(state != state_t::CONNECTING)) { + logger().debug("{} triggered {} during Socket::connect()", + conn, get_state_name(state)); + return sock->close().then([this, sock = std::move(sock)] { abort_protocol(); }); } + socket = std::move(sock); return seastar::now(); }).then([this] { auth_meta = seastar::make_lw_shared(); diff --git a/src/crimson/net/Socket.cc b/src/crimson/net/Socket.cc index ca4e80db5dd..763b4e2129c 100644 --- a/src/crimson/net/Socket.cc +++ b/src/crimson/net/Socket.cc @@ -87,10 +87,6 @@ Socket::read_exactly(size_t bytes) { } void Socket::shutdown() { -#ifndef NDEBUG - ceph_assert(!down); - down = true; -#endif socket.shutdown_input(); socket.shutdown_output(); } diff --git a/src/crimson/net/Socket.h b/src/crimson/net/Socket.h index fb3f037cdb5..21de1db2b3c 100644 --- a/src/crimson/net/Socket.h +++ b/src/crimson/net/Socket.h @@ -23,7 +23,6 @@ class Socket seastar::output_stream out; #ifndef NDEBUG - bool down = false; bool closed = false; #endif