From: Kefu Chai Date: Thu, 23 Jul 2020 16:09:08 +0000 (+0800) Subject: crimson/net: do not reset need_addr before learning it X-Git-Tag: v16.1.0~1634^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F36268%2Fhead;p=ceph.git crimson/net: do not reset need_addr before learning it because we don't bind both v1 and v2 addresses, when monitor returns a v1 peer address, as the client side, crimson-osd just drops the connection. but this failed attempt to learn the myaddr resets `need_addr`. and this prevents crimson-osd from learning the v2 address returned by monitor. in this change, we reset need_addr only after it is learned from the peer. Signed-off-by: Kefu Chai --- diff --git a/src/crimson/net/SocketMessenger.cc b/src/crimson/net/SocketMessenger.cc index f3d23f4aae67..7dc1e8969517 100644 --- a/src/crimson/net/SocketMessenger.cc +++ b/src/crimson/net/SocketMessenger.cc @@ -199,13 +199,13 @@ seastar::future<> SocketMessenger::learned_addr(const entity_addr_t &peer_addr_f } return seastar::now(); } - need_addr = false; if (get_myaddr().get_type() == entity_addr_t::TYPE_NONE) { // Not bound entity_addr_t addr = peer_addr_for_me; addr.set_type(entity_addr_t::TYPE_ANY); addr.set_port(0); + need_addr = false; return set_myaddrs(entity_addrvec_t{addr} ).then([this, &conn, peer_addr_for_me] { logger().info("{} learned myaddr={} (unbound) from {}", @@ -230,6 +230,7 @@ seastar::future<> SocketMessenger::learned_addr(const entity_addr_t &peer_addr_f entity_addr_t addr = peer_addr_for_me; addr.set_type(get_myaddr().get_type()); addr.set_port(get_myaddr().get_port()); + need_addr = false; return set_myaddrs(entity_addrvec_t{addr} ).then([this, &conn, peer_addr_for_me] { logger().info("{} learned myaddr={} (blank IP) from {}", @@ -241,6 +242,7 @@ seastar::future<> SocketMessenger::learned_addr(const entity_addr_t &peer_addr_f throw std::system_error( make_error_code(crimson::net::error::bad_peer_address)); } else { + need_addr = false; return seastar::now(); } }