]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
msg/async/ProtocolV2: only update socket_addr if we learned our addr
authorSage Weil <sage@redhat.com>
Mon, 29 Oct 2018 22:23:05 +0000 (17:23 -0500)
committerSage Weil <sage@redhat.com>
Fri, 21 Dec 2018 21:30:18 +0000 (15:30 -0600)
Signed-off-by: Sage Weil <sage@redhat.com>
src/msg/async/AsyncMessenger.cc
src/msg/async/AsyncMessenger.h
src/msg/async/ProtocolV2.cc

index bcb74c4bd260cbc4f4d4861ff9f1f65b87b9f2ea..b67c9bc4e7c3f8ec7f3f58d6de5774b95119ee4d 100644 (file)
@@ -808,7 +808,7 @@ int AsyncMessenger::get_proto_version(int peer_type, bool connect) const
   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.
@@ -817,8 +817,8 @@ void AsyncMessenger::learned_addr(const entity_addr_t &peer_addr_for_me)
   // 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()) {
@@ -844,8 +844,9 @@ void AsyncMessenger::learned_addr(const entity_addr_t &peer_addr_for_me)
     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()
index b3a826a92c433e6fcf69d07febaddf5844b82161..0de46a3c9f88f4ffd8cddf1fb0d6463825a1b360 100644 (file)
@@ -372,7 +372,7 @@ public:
     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);
index 932d45f537be3f07d7660179c9a7bf055d934936..77c6f4ec26aa3fab056d469ed14990b482c80adf 100644 (file)
@@ -1383,12 +1383,11 @@ CtPtr ProtocolV2::handle_server_addrvec_and_identify(char *buffer, int r) {
   }
 
   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) {
@@ -1401,6 +1400,9 @@ CtPtr ProtocolV2::handle_server_addrvec_and_identify(char *buffer, int r) {
   }
 
   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 "