From 80cc838b7bdfd654d35a5409b5b54c6318d5db5f Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 6 Feb 2019 06:23:16 -0600 Subject: [PATCH] msg/{async,simple}: make learned_addr a bit smarter Only set type ANY if we are a pure client; otherwise, preserve the type. Also, only populate the addr if we have a blank ip (sometimes we already know it from learn_addr_unknowns). Signed-off-by: Sage Weil --- src/msg/async/AsyncMessenger.cc | 6 ++++-- src/msg/simple/SimpleMessenger.cc | 11 ++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/msg/async/AsyncMessenger.cc b/src/msg/async/AsyncMessenger.cc index 72423f8087c..f6bcaa9b794 100644 --- a/src/msg/async/AsyncMessenger.cc +++ b/src/msg/async/AsyncMessenger.cc @@ -899,12 +899,14 @@ bool AsyncMessenger::learned_addr(const entity_addr_t &peer_addr_for_me) // fix all addrs of the same family, regardless of type (msgr2 vs legacy) entity_addrvec_t newaddrs = *my_addrs; for (auto& a : newaddrs.v) { - if (a.get_family() == peer_addr_for_me.get_family()) { + if (a.is_blank_ip() && + a.get_family() == peer_addr_for_me.get_family()) { entity_addr_t t = peer_addr_for_me; - t.set_type(a.get_type()); if (!did_bind) { + t.set_type(entity_addr_t::TYPE_ANY); t.set_port(0); } else { + t.set_type(a.get_type()); t.set_port(a.get_port()); } t.set_nonce(a.get_nonce()); diff --git a/src/msg/simple/SimpleMessenger.cc b/src/msg/simple/SimpleMessenger.cc index 39f159df9df..09d1ab7b2a2 100644 --- a/src/msg/simple/SimpleMessenger.cc +++ b/src/msg/simple/SimpleMessenger.cc @@ -740,10 +740,15 @@ void SimpleMessenger::learned_addr(const entity_addr_t &peer_addr_for_me) return; lock.Lock(); - if (need_addr) { + if (need_addr && my_addr.is_blank_ip()) { entity_addr_t t = peer_addr_for_me; - t.set_type(entity_addr_t::TYPE_ANY); - t.set_port(my_addr.get_port()); + if (!did_bind) { + t.set_type(entity_addr_t::TYPE_ANY); + t.set_port(0); + } else { + t.set_type(entity_addr_t::TYPE_LEGACY); + t.set_port(my_addr.get_port()); + } t.set_nonce(my_addr.get_nonce()); ANNOTATE_BENIGN_RACE_SIZED(&my_addr, sizeof(my_addr), "SimpleMessenger learned addr"); -- 2.39.5