From: Sage Weil Date: Sat, 26 Jan 2019 23:01:14 +0000 (-0600) Subject: msg/async/AsyncMessenger: clear need_addr *after* we set our new addr X-Git-Tag: v14.1.0~271^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6e933fe1b8f2863deb76a7e0accd9f315d1cb6f0;p=ceph.git msg/async/AsyncMessenger: clear need_addr *after* we set our new addr We check need_addr at the top without a lock held, so we need to be sure we finished our work before we clear it, or else when there are two racing threads the first will get the clock and clear the value and the second will do nothing and see the unlearned value before the first finishes. Signed-off-by: Sage Weil --- diff --git a/src/msg/async/AsyncMessenger.cc b/src/msg/async/AsyncMessenger.cc index cbb397279238..908052f11c41 100644 --- a/src/msg/async/AsyncMessenger.cc +++ b/src/msg/async/AsyncMessenger.cc @@ -882,7 +882,6 @@ bool AsyncMessenger::learned_addr(const entity_addr_t &peer_addr_for_me) return false; std::lock_guard l(lock); if (need_addr) { - need_addr = false; if (my_addrs->empty()) { auto a = peer_addr_for_me; a.set_nonce(nonce); @@ -913,6 +912,7 @@ bool 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(); + need_addr = false; return true; } return false;