* Accepter
*/
-int Accepter::bind(const entity_addr_t &bind_addr, int avoid_port1, int avoid_port2)
+int Accepter::bind(const entity_addr_t &bind_addr, const set<int>& avoid_ports)
{
const md_config_t *conf = msgr->cct->_conf;
// bind to a socket
} else {
// try a range of ports
for (int port = msgr->cct->_conf->ms_bind_port_min; port <= msgr->cct->_conf->ms_bind_port_max; port++) {
- if (port == avoid_port1 || port == avoid_port2)
+ if (avoid_ports.count(port))
continue;
listen_addr.set_port(port);
rc = ::bind(listen_sd, (struct sockaddr *) &listen_addr.ss_addr(), listen_addr.addr_size());
return 0;
}
-int Accepter::rebind(int avoid_port)
+int Accepter::rebind(const set<int>& avoid_ports)
{
- ldout(msgr->cct,1) << "accepter.rebind avoid " << avoid_port << dendl;
+ ldout(msgr->cct,1) << "accepter.rebind avoid " << avoid_ports << dendl;
stop();
msgr->unlearn_addr();
entity_addr_t addr = msgr->get_myaddr();
- int old_port = addr.get_port();
+ set<int> new_avoid = avoid_ports;
+ new_avoid.insert(addr.get_port());
addr.set_port(0);
- ldout(msgr->cct,10) << " will try " << addr << dendl;
- int r = bind(addr, old_port, avoid_port);
+ ldout(msgr->cct,10) << " will try " << addr << " and avoid ports " << new_avoid << dendl;
+ int r = bind(addr, new_avoid);
if (r == 0)
start();
return r;
void *entry();
void stop();
- int bind(const entity_addr_t &bind_addr, int avoid_port1=0, int avoid_port2=0);
- int rebind(int avoid_port);
+ int bind(const entity_addr_t &bind_addr, const set<int>& avoid_ports);
+ int rebind(const set<int>& avoid_port);
int start();
};
*
* @param avoid_port An additional port to avoid binding to.
*/
- virtual int rebind(int avoid_port) { return -EOPNOTSUPP; }
+ virtual int rebind(const set<int>& avoid_ports) { return -EOPNOTSUPP; }
/**
* @} // Configuration
*/
lock.Unlock();
// bind to a socket
- int r = accepter.bind(bind_addr);
+ set<int> avoid_ports;
+ int r = accepter.bind(bind_addr, avoid_ports);
if (r >= 0)
did_bind = true;
return r;
}
-int SimpleMessenger::rebind(int avoid_port)
+int SimpleMessenger::rebind(const set<int>& avoid_ports)
{
- ldout(cct,1) << "rebind avoid " << avoid_port << dendl;
+ ldout(cct,1) << "rebind avoid " << avoid_ports << dendl;
mark_down_all();
assert(did_bind);
- return accepter.rebind(avoid_port);
+ return accepter.rebind(avoid_ports);
}
int SimpleMessenger::start()
*
* @param avoid_port An additional port to avoid binding to.
*/
- int rebind(int avoid_port);
+ int rebind(const set<int>& avoid_ports);
/** @} Configuration functions */
/**
do_restart = true;
bind_epoch = osdmap->get_epoch();
- int cport = cluster_messenger->get_myaddr().get_port();
- int hbport = hb_back_server_messenger->get_myaddr().get_port();
+ set<int> avoid_ports;
+ avoid_ports.insert(cluster_messenger->get_myaddr().get_port());
+ avoid_ports.insert(hb_back_server_messenger->get_myaddr().get_port());
+ avoid_ports.insert(hb_front_server_messenger->get_myaddr().get_port());
- int r = cluster_messenger->rebind(hbport);
+ int r = cluster_messenger->rebind(avoid_ports);
if (r != 0)
do_shutdown = true; // FIXME: do_restart?
- r = hb_back_server_messenger->rebind(cport);
+ r = hb_back_server_messenger->rebind(avoid_ports);
if (r != 0)
do_shutdown = true; // FIXME: do_restart?
- r = hb_front_server_messenger->rebind(hbport);
+ r = hb_front_server_messenger->rebind(avoid_ports);
if (r != 0)
do_shutdown = true; // FIXME: do_restart?