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);
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);
* @param avoid_ports Additional port to avoid binding to.
*/
virtual int rebind(const set<int>& 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
*/
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)
{
int bind(const entity_addr_t& bind_addr);
int rebind(const set<int>& avoid_ports);
+ int client_bind(const entity_addr_t& bind_addr);
/** @} Configuration functions */
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();
int bind(const entity_addr_t& bind_addr);
int rebind(const set<int>& avoid_ports);
+ int client_bind(const entity_addr_t& bind_addr);
/** @} Configuration functions */