return 0;
}
-void AsyncMessenger::learned_addr(const entity_addr_t &peer_addr_for_me)
+bool AsyncMessenger::learned_addr(const entity_addr_t &peer_addr_for_me)
{
// be careful here: multiple threads may block here, and readers of
// my_addr do NOT hold any lock.
// mutex. if it is already false, we need not retake the mutex at
// all.
if (!need_addr)
- return ;
- lock.Lock();
+ return false;
+ std::lock_guard l(lock);
if (need_addr) {
need_addr = false;
if (my_addrs->empty()) {
ldout(cct, 1) << __func__ << " learned my addr " << *my_addrs
<< " (peer_addr_for_me " << peer_addr_for_me << ")" << dendl;
_init_local_connection();
+ return true;
}
- lock.Unlock();
+ return false;
}
int AsyncMessenger::reap_dead()
return 0;
}
- void learned_addr(const entity_addr_t &peer_addr_for_me);
+ bool learned_addr(const entity_addr_t &peer_addr_for_me);
void add_accept(Worker *w, ConnectedSocket cli_socket,
const entity_addr_t &listen_addr,
const entity_addr_t &peer_addr);
}
connection->set_peer_addrs(paddrs);
- connection->socket_addr = peer_addr_for_me;
ldout(cct, 20) << __func__ << " connect peer addr for me is "
<< peer_addr_for_me << dendl;
connection->lock.unlock();
- messenger->learned_addr(peer_addr_for_me);
+ bool learned = messenger->learned_addr(peer_addr_for_me);
if (cct->_conf->ms_inject_internal_delays &&
cct->_conf->ms_inject_socket_failures) {
if (rand() % cct->_conf->ms_inject_socket_failures == 0) {
}
connection->lock.lock();
+ if (learned) {
+ connection->socket_addr = peer_addr_for_me;
+ }
if (state != CONNECTING_WAIT_BANNER_AND_IDENTIFY) {
ldout(cct, 1) << __func__
<< " state changed while learned_addr, mark_down or "