From 8bcc639ab2171827286dafb42ef4635477dee8f1 Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Wed, 29 Jun 2011 10:46:06 -0700 Subject: [PATCH] messenger: add a set_ip function to initialize the IP Previously we only filled in IPs if they were set by the config file (at startup) or after we connected to the monitor. Unfortunately this could lead to conditions where the OSD connected to itself without knowing that's what it was doing, because the cluster_addr IP wasn't filled in until much too late. We've provided a mechanism for filling in the IP and do so in OSD::boot_start. Signed-off-by: Greg Farnum --- src/msg/Messenger.h | 1 + src/msg/SimpleMessenger.cc | 19 ++++++++++++++++++- src/msg/SimpleMessenger.h | 1 + src/osd/OSD.cc | 2 ++ 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/msg/Messenger.h b/src/msg/Messenger.h index e34f1ccd565b5..b5612fe8589d7 100644 --- a/src/msg/Messenger.h +++ b/src/msg/Messenger.h @@ -66,6 +66,7 @@ protected: // accessors entity_name_t get_myname() { return _my_name; } virtual entity_addr_t get_myaddr() = 0; + virtual void set_ip(entity_addr_t &addr) = 0; entity_inst_t get_myinst() { return entity_inst_t(get_myname(), get_myaddr()); } void set_myname(const entity_name_t m) { _my_name = m; } diff --git a/src/msg/SimpleMessenger.cc b/src/msg/SimpleMessenger.cc index f5b42489642ea..1c92ead8752e6 100644 --- a/src/msg/SimpleMessenger.cc +++ b/src/msg/SimpleMessenger.cc @@ -479,10 +479,27 @@ int SimpleMessenger::lazy_send_message(Message *m, const entity_inst_t& dest) entity_addr_t SimpleMessenger::get_myaddr() { - entity_addr_t a = msgr->ms_addr; + entity_addr_t a = ms_addr; return a; } +/** + * If ms_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_ip(entity_addr_t &addr) +{ + entity_addr_t blank_ip; + blank_ip.set_family(ms_addr.get_family()); + blank_ip.set_port(ms_addr.get_port()); + blank_ip.set_nonce(ms_addr.get_nonce()); + blank_ip.type = ms_addr.type; + + if (ms_addr.probably_equals(blank_ip)) { + ms_addr.addr = addr.addr; + ms_addr.set_port(blank_ip.get_port()); + } +} diff --git a/src/msg/SimpleMessenger.h b/src/msg/SimpleMessenger.h index a2c223940a2de..e8b09846b6821 100644 --- a/src/msg/SimpleMessenger.h +++ b/src/msg/SimpleMessenger.h @@ -516,6 +516,7 @@ private: } entity_addr_t get_myaddr(); + void set_ip(entity_addr_t &addr); int get_dispatch_queue_len() { return dispatch_queue.get_queue_len(); diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index b0f5ac40f6a23..39a167d48bb02 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -1967,6 +1967,7 @@ void OSD::send_boot() int port = cluster_addr.get_port(); cluster_addr = client_messenger->get_myaddr(); cluster_addr.set_port(port); + cluster_messenger->set_ip(cluster_addr); dout(10) << " assuming cluster_addr ip matches client_addr" << dendl; } entity_addr_t hb_addr = heartbeat_messenger->get_myaddr(); @@ -1974,6 +1975,7 @@ void OSD::send_boot() int port = hb_addr.get_port(); hb_addr = cluster_addr; hb_addr.set_port(port); + heartbeat_messenger->set_ip(hb_addr); dout(10) << " assuming hb_addr ip matches cluster_addr" << dendl; } MOSDBoot *mboot = new MOSDBoot(superblock, hb_addr, cluster_addr); -- 2.39.5