From: Haomai Wang Date: Thu, 12 Jan 2017 07:04:28 +0000 (+0800) Subject: msgr: add client_bind to allow client messenger save ip X-Git-Tag: v12.0.0~112^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=08caf09377c0d3e1934c2eb043828849e095e208;p=ceph.git msgr: add client_bind to allow client messenger save ip Signed-off-by: Haomai Wang --- diff --git a/src/ceph_osd.cc b/src/ceph_osd.cc index 334fb7fa8e17..4aab15d4515e 100644 --- a/src/ceph_osd.cc +++ b/src/ceph_osd.cc @@ -560,6 +560,9 @@ int main(int argc, const char **argv) hb_back_addr.set_port(0); } r = ms_hb_back_server->bind(hb_back_addr); + if (r < 0) + exit(1); + r = ms_hb_back_client->client_bind(hb_back_addr); if (r < 0) exit(1); @@ -568,6 +571,9 @@ int main(int argc, const char **argv) if (hb_front_addr.is_ip()) hb_front_addr.set_port(0); r = ms_hb_front_server->bind(hb_front_addr); + if (r < 0) + exit(1); + r = ms_hb_front_client->client_bind(hb_back_addr); if (r < 0) exit(1); diff --git a/src/msg/Messenger.h b/src/msg/Messenger.h index 08b53d9b7428..a66f8856bedc 100644 --- a/src/msg/Messenger.h +++ b/src/msg/Messenger.h @@ -408,6 +408,14 @@ public: * @param avoid_ports Additional port to avoid binding to. */ virtual int rebind(const set& avoid_ports) { return -EOPNOTSUPP; } + /** + * Bind the 'client' Messenger to a specific address.Messenger will bind + * the address before connect to others when option ms_bind_before_connect + * is true. + * @param bind_addr The address to bind to. + * @return 0 on success, or -1 on error, or -errno if + */ + virtual int client_bind(const entity_addr_t& bind_addr) = 0; /** * @} // Configuration */ diff --git a/src/msg/async/AsyncMessenger.cc b/src/msg/async/AsyncMessenger.cc index 5a8d107117b8..d0b939a2002e 100644 --- a/src/msg/async/AsyncMessenger.cc +++ b/src/msg/async/AsyncMessenger.cc @@ -376,6 +376,25 @@ int AsyncMessenger::rebind(const set& avoid_ports) return 0; } +int AsyncMessenger::client_bind(const entity_addr_t &bind_addr) +{ + lock.Lock(); + if (did_bind) { + assert(my_inst.addr == bind_addr); + return 0; + } + if (started) { + ldout(cct, 10) << __func__ << " already started" << dendl; + lock.Unlock(); + return -1; + } + ldout(cct, 10) << __func__ << " " << bind_addr << dendl; + lock.Unlock(); + + set_myaddr(bind_addr); + return 0; +} + void AsyncMessenger::_finish_bind(const entity_addr_t& bind_addr, const entity_addr_t& listen_addr) { diff --git a/src/msg/async/AsyncMessenger.h b/src/msg/async/AsyncMessenger.h index 1eb2a6b982a2..384e4465a7bd 100644 --- a/src/msg/async/AsyncMessenger.h +++ b/src/msg/async/AsyncMessenger.h @@ -116,6 +116,7 @@ public: int bind(const entity_addr_t& bind_addr); int rebind(const set& avoid_ports); + int client_bind(const entity_addr_t& bind_addr); /** @} Configuration functions */ diff --git a/src/msg/simple/SimpleMessenger.cc b/src/msg/simple/SimpleMessenger.cc index bc8834811414..aed27ac1b4e7 100644 --- a/src/msg/simple/SimpleMessenger.cc +++ b/src/msg/simple/SimpleMessenger.cc @@ -306,6 +306,27 @@ int SimpleMessenger::rebind(const set& avoid_ports) return accepter.rebind(avoid_ports); } + +int SimpleMessenger::client_bind(const entity_addr_t &bind_addr) +{ + lock.Lock(); + if (did_bind) { + assert(my_inst.addr == bind_addr); + return 0; + } + if (started) { + ldout(cct,10) << "rank.bind already started" << dendl; + lock.Unlock(); + return -1; + } + ldout(cct,10) << "rank.bind " << bind_addr << dendl; + lock.Unlock(); + + set_myaddr(bind_addr); + return 0; +} + + int SimpleMessenger::start() { lock.Lock(); diff --git a/src/msg/simple/SimpleMessenger.h b/src/msg/simple/SimpleMessenger.h index ac0c8293ec63..65005fda98c6 100644 --- a/src/msg/simple/SimpleMessenger.h +++ b/src/msg/simple/SimpleMessenger.h @@ -115,6 +115,7 @@ public: int bind(const entity_addr_t& bind_addr); int rebind(const set& avoid_ports); + int client_bind(const entity_addr_t& bind_addr); /** @} Configuration functions */