diff --git a/src/msg/async/AsyncMessenger.cc b/src/msg/async/AsyncMessenger.cc index bcb74c4bd26..b67c9bc4e7c 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 b3a826a92c4..0de46a3c9f8 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 932d45f537b..77c6f4ec26a 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 "