From 6e933fe1b8f2863deb76a7e0accd9f315d1cb6f0 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sat, 26 Jan 2019 17:01:14 -0600 Subject: [PATCH] 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 --- src/msg/async/AsyncMessenger.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/msg/async/AsyncMessenger.cc b/src/msg/async/AsyncMessenger.cc index cbb39727923..908052f11c4 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; -- 2.47.3