From: Sage Weil Date: Mon, 29 Oct 2018 22:23:05 +0000 (-0500) Subject: msg/async/ProtocolV2: only update socket_addr if we learned our addr X-Git-Tag: v14.1.0~484^2~99 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=16a0bbb0aa7545d930b6b321aec4063d4b7a31e0;p=ceph.git msg/async/ProtocolV2: only update socket_addr if we learned our addr Signed-off-by: Sage Weil --- diff --git a/src/msg/async/AsyncMessenger.cc b/src/msg/async/AsyncMessenger.cc index bcb74c4bd260..b67c9bc4e7c3 100644 --- a/src/msg/async/AsyncMessenger.cc +++ b/src/msg/async/AsyncMessenger.cc @@ -808,7 +808,7 @@ int AsyncMessenger::get_proto_version(int peer_type, bool connect) const return 0; } -void AsyncMessenger::learned_addr(const entity_addr_t &peer_addr_for_me) +bool AsyncMessenger::learned_addr(const entity_addr_t &peer_addr_for_me) { // be careful here: multiple threads may block here, and readers of // my_addr do NOT hold any lock. @@ -817,8 +817,8 @@ void AsyncMessenger::learned_addr(const entity_addr_t &peer_addr_for_me) // mutex. if it is already false, we need not retake the mutex at // all. if (!need_addr) - return ; - lock.Lock(); + return false; + std::lock_guard l(lock); if (need_addr) { need_addr = false; if (my_addrs->empty()) { @@ -844,8 +844,9 @@ void AsyncMessenger::learned_addr(const entity_addr_t &peer_addr_for_me) ldout(cct, 1) << __func__ << " learned my addr " << *my_addrs << " (peer_addr_for_me " << peer_addr_for_me << ")" << dendl; _init_local_connection(); + return true; } - lock.Unlock(); + return false; } int AsyncMessenger::reap_dead() diff --git a/src/msg/async/AsyncMessenger.h b/src/msg/async/AsyncMessenger.h index b3a826a92c43..0de46a3c9f88 100644 --- a/src/msg/async/AsyncMessenger.h +++ b/src/msg/async/AsyncMessenger.h @@ -372,7 +372,7 @@ public: return 0; } - void learned_addr(const entity_addr_t &peer_addr_for_me); + bool learned_addr(const entity_addr_t &peer_addr_for_me); void add_accept(Worker *w, ConnectedSocket cli_socket, const entity_addr_t &listen_addr, const entity_addr_t &peer_addr); diff --git a/src/msg/async/ProtocolV2.cc b/src/msg/async/ProtocolV2.cc index 932d45f537be..77c6f4ec26aa 100644 --- a/src/msg/async/ProtocolV2.cc +++ b/src/msg/async/ProtocolV2.cc @@ -1383,12 +1383,11 @@ CtPtr ProtocolV2::handle_server_addrvec_and_identify(char *buffer, int r) { } connection->set_peer_addrs(paddrs); - connection->socket_addr = peer_addr_for_me; ldout(cct, 20) << __func__ << " connect peer addr for me is " << peer_addr_for_me << dendl; connection->lock.unlock(); - messenger->learned_addr(peer_addr_for_me); + bool learned = messenger->learned_addr(peer_addr_for_me); if (cct->_conf->ms_inject_internal_delays && cct->_conf->ms_inject_socket_failures) { if (rand() % cct->_conf->ms_inject_socket_failures == 0) { @@ -1401,6 +1400,9 @@ CtPtr ProtocolV2::handle_server_addrvec_and_identify(char *buffer, int r) { } connection->lock.lock(); + if (learned) { + connection->socket_addr = peer_addr_for_me; + } if (state != CONNECTING_WAIT_BANNER_AND_IDENTIFY) { ldout(cct, 1) << __func__ << " state changed while learned_addr, mark_down or "