From f43731fd344cd3747c0fd7b10b1a694cacf530c4 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 12 Jun 2018 11:44:16 -0500 Subject: [PATCH] msg: make set_addr_unknowns take an addrvec Nicely collapse the wonky logic in OSD into the helper! Signed-off-by: Sage Weil --- src/mgr/DaemonServer.cc | 2 +- src/msg/Messenger.h | 2 +- src/msg/async/AsyncMessenger.cc | 24 ++++++++++--- src/msg/async/AsyncMessenger.h | 2 +- src/msg/simple/SimpleMessenger.cc | 6 +++- src/msg/simple/SimpleMessenger.h | 2 +- src/msg/xio/XioMessenger.h | 2 +- src/osd/OSD.cc | 58 +++++++------------------------ 8 files changed, 41 insertions(+), 57 deletions(-) diff --git a/src/mgr/DaemonServer.cc b/src/mgr/DaemonServer.cc index f7feae2ea209c..257177ea15636 100644 --- a/src/mgr/DaemonServer.cc +++ b/src/mgr/DaemonServer.cc @@ -134,7 +134,7 @@ int DaemonServer::init(uint64_t gid, entity_addr_t client_addr) } msgr->set_myname(entity_name_t::MGR(gid)); - msgr->set_addr_unknowns(client_addr); + msgr->set_addr_unknowns(entity_addrvec_t(client_addr)); msgr->start(); msgr->add_dispatcher_tail(this); diff --git a/src/msg/Messenger.h b/src/msg/Messenger.h index a83d86746514b..9f8937e6b3256 100644 --- a/src/msg/Messenger.h +++ b/src/msg/Messenger.h @@ -197,7 +197,7 @@ public: * * @param addr The address to use as a template. */ - virtual void set_addr_unknowns(const entity_addr_t &addr) = 0; + virtual bool set_addr_unknowns(const entity_addrvec_t &addrs) = 0; /** * Set the address for this Messenger. This is useful if the Messenger * binds to a specific address but advertises a different address on the diff --git a/src/msg/async/AsyncMessenger.cc b/src/msg/async/AsyncMessenger.cc index a8407e18315f7..6e693a767cd49 100644 --- a/src/msg/async/AsyncMessenger.cc +++ b/src/msg/async/AsyncMessenger.cc @@ -657,17 +657,31 @@ void AsyncMessenger::submit_message(Message *m, AsyncConnectionRef con, * If my_addr doesn't have an IP set, this function * will fill it in from the passed addr. Otherwise it does nothing and returns. */ -void AsyncMessenger::set_addr_unknowns(const entity_addr_t &addr) +bool AsyncMessenger::set_addr_unknowns(const entity_addrvec_t &addrs) { + bool ret = false; Mutex::Locker l(lock); - if (my_addrs.legacy_addr().is_blank_ip()) { - for (auto& a : my_addrs.v) { + + for (auto& a : my_addrs.v) { + if (a.is_blank_ip()) { int port = a.get_port(); - a.u = addr.u; - a.set_port(port); + for (auto& b : addrs.v) { + if (a.get_type() == b.get_type() && + a.get_family() == b.get_family()) { + ldout(cct,1) << __func__ << " assuming my addr " << a + << " matches provided addr " << b << dendl; + a = b; + a.set_port(port); + ret = true; + break; + } + } } + } + if (ret) { _init_local_connection(); } + return ret; } void AsyncMessenger::set_addrs(const entity_addrvec_t &addrs) diff --git a/src/msg/async/AsyncMessenger.h b/src/msg/async/AsyncMessenger.h index 16b9b9b4ba68b..ee886a7d5109c 100644 --- a/src/msg/async/AsyncMessenger.h +++ b/src/msg/async/AsyncMessenger.h @@ -94,7 +94,7 @@ public: /** @defgroup Accessors * @{ */ - void set_addr_unknowns(const entity_addr_t &addr) override; + bool set_addr_unknowns(const entity_addrvec_t &addr) override; void set_addrs(const entity_addrvec_t &addrs) override; int get_dispatch_queue_len() override { diff --git a/src/msg/simple/SimpleMessenger.cc b/src/msg/simple/SimpleMessenger.cc index efd8362033003..426a770ab276f 100644 --- a/src/msg/simple/SimpleMessenger.cc +++ b/src/msg/simple/SimpleMessenger.cc @@ -147,8 +147,10 @@ int SimpleMessenger::_send_message(Message *m, Connection *con) * If my_inst.addr doesn't have an IP set, this function * will fill it in from the passed addr. Otherwise it does nothing and returns. */ -void SimpleMessenger::set_addr_unknowns(const entity_addr_t &addr) +bool SimpleMessenger::set_addr_unknowns(const entity_addrvec_t &addrs) { + bool ret = false; + auto addr = addrs.legacy_addr(); assert(my_addr == my_addrs.front()); if (my_addr.is_blank_ip()) { ldout(cct,1) << __func__ << " " << addr << dendl; @@ -158,10 +160,12 @@ void SimpleMessenger::set_addr_unknowns(const entity_addr_t &addr) t.set_port(port); set_addrs(entity_addrvec_t(t)); init_local_connection(); + ret = true; } else { ldout(cct,1) << __func__ << " " << addr << " no-op" << dendl; } assert(my_addr == my_addrs.front()); + return ret; } void SimpleMessenger::set_myaddrs(const entity_addrvec_t &av) diff --git a/src/msg/simple/SimpleMessenger.h b/src/msg/simple/SimpleMessenger.h index 56640cd41e76f..2d47aeda67251 100644 --- a/src/msg/simple/SimpleMessenger.h +++ b/src/msg/simple/SimpleMessenger.h @@ -93,7 +93,7 @@ public: /** @defgroup Accessors * @{ */ - void set_addr_unknowns(const entity_addr_t& addr) override; + bool set_addr_unknowns(const entity_addrvec_t& addr) override; void set_addrs(const entity_addrvec_t &addr) override; void set_myaddrs(const entity_addrvec_t& a) override; diff --git a/src/msg/xio/XioMessenger.h b/src/msg/xio/XioMessenger.h index 8ce33d48256d1..a075708101872 100644 --- a/src/msg/xio/XioMessenger.h +++ b/src/msg/xio/XioMessenger.h @@ -98,7 +98,7 @@ public: void *cb_user_context); /* Messenger interface */ - virtual void set_addr_unknowns(const entity_addr_t &addr) override + virtual bool set_addr_unknowns(const entity_addrvec_t &addr) override { } /* XXX applicable? */ virtual void set_addr(const entity_addr_t &addr) override { } /* XXX applicable? */ diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 7c2ff7f1d21b9..b2a225d883279 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -5350,64 +5350,30 @@ void OSD::_send_boot() << ", hb_back_addrs " << hb_back_addrs << ", hb_front_addrs " << hb_front_addrs << dendl; - - for (auto& a : cluster_addrs.v) { - if (a.is_blank_ip()) { - int port = a.get_port(); - for (auto& b : client_addrs.v) { - if (a.get_type() == b.get_type() && - a.get_family() == b.get_family()) { - dout(10) << " assuming cluster_addr " << a - << " matches client_addr " << b << dendl; - a = b; - a.set_port(port); - cluster_messenger->set_addr_unknowns(a); - break; - } - } - } + if (cluster_messenger->set_addr_unknowns(client_addrs)) { + dout(10) << " assuming cluster_addrs match client_addrs " + << client_addrs << dendl; + cluster_addrs = cluster_messenger->get_myaddrs(); } if (auto session = local_connection->get_priv(); !session) { cluster_messenger->ms_deliver_handle_fast_connect(local_connection); } local_connection = hb_back_server_messenger->get_loopback_connection().get(); - for (auto& a : hb_back_addrs.v) { - if (a.is_blank_ip()) { - int port = a.get_port(); - for (auto& b : cluster_addrs.v) { - if (a.get_type() == b.get_type() && - a.get_family() == b.get_family()) { - dout(10) << " assuming hb_back_addr " << a - << " matches cluster_addr " << b << dendl; - a = b; - a.set_port(port); - hb_back_server_messenger->set_addr_unknowns(a); - break; - } - } - } + if (hb_back_server_messenger->set_addr_unknowns(cluster_addrs)) { + dout(10) << " assuming hb_back_addrs match cluster_addrs " + << cluster_addrs << dendl; + hb_back_addrs = hb_back_server_messenger->get_myaddrs(); } if (auto session = local_connection->get_priv(); !session) { hb_back_server_messenger->ms_deliver_handle_fast_connect(local_connection); } local_connection = hb_front_server_messenger->get_loopback_connection().get(); - for (auto& a : hb_front_addrs.v) { - if (a.is_blank_ip()) { - int port = a.get_port(); - for (auto& b : client_addrs.v) { - if (a.get_type() == b.get_type() && - a.get_family() == b.get_family()) { - dout(10) << " assuming hb_front_addr " << a - << " matches client_addr " << b << dendl; - a = b; - a.set_port(port); - hb_front_server_messenger->set_addr_unknowns(a); - break; - } - } - } + if (hb_front_server_messenger->set_addr_unknowns(client_addrs)) { + dout(10) << " assuming hb_front_addrs match client_addrs " + << client_addrs << dendl; + hb_front_addrs = hb_front_server_messenger->get_myaddrs(); } if (auto session = local_connection->get_priv(); !session) { hb_front_server_messenger->ms_deliver_handle_fast_connect(local_connection); -- 2.39.5