]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
msg/Messenger: use safe_item_history<> for my_addrs
authorSage Weil <sage@redhat.com>
Wed, 27 Jun 2018 13:40:24 +0000 (08:40 -0500)
committerSage Weil <sage@redhat.com>
Tue, 3 Jul 2018 18:01:24 +0000 (13:01 -0500)
Mutating the item in place is not safe.

Signed-off-by: Sage Weil <sage@redhat.com>
src/msg/Messenger.h
src/msg/async/AsyncMessenger.cc
src/msg/simple/Accepter.cc

index ebc64c34f618001c6ec771d9712e043ebf7ea97a..ee645e7cc1aa46c13e01df7165d07f893b336616 100644 (file)
@@ -54,7 +54,7 @@ protected:
   entity_name_t my_name;
 
   /// my addr
-  mutable_item_history<entity_addrvec_t> my_addrs;
+  safe_item_history<entity_addrvec_t> my_addrs;
 
   int default_send_priority;
   /// set to true once the Messenger has started, and set to false on shutdown
index d4a74963e984535737020f30b5042e232d5827c0..48922b9c48957038d01c4361244e0272f70eb80f 100644 (file)
@@ -472,9 +472,11 @@ void AsyncMessenger::_finish_bind(const entity_addrvec_t& bind_addrs,
   if (get_myaddrs().front().get_port() == 0) {
     set_myaddrs(listen_addrs);
   }
-  for (auto& a : my_addrs->v) {
+  entity_addrvec_t newaddrs = *my_addrs;
+  for (auto& a : newaddrs.v) {
     a.set_nonce(nonce);
   }
+  set_myaddrs(newaddrs);
 
   init_local_connection();
 
@@ -495,9 +497,11 @@ int AsyncMessenger::start()
   stopped = false;
 
   if (!did_bind) {
-    for (auto& a : my_addrs->v) {
+    entity_addrvec_t newaddrs = *my_addrs;
+    for (auto& a : newaddrs.v) {
       a.nonce = nonce;
     }
+    set_myaddrs(newaddrs);
     _init_local_connection();
   }
 
@@ -678,7 +682,8 @@ bool AsyncMessenger::set_addr_unknowns(const entity_addrvec_t &addrs)
   bool ret = false;
   Mutex::Locker l(lock);
 
-  for (auto& a : my_addrs->v) {
+  entity_addrvec_t newaddrs = *my_addrs;
+  for (auto& a : newaddrs.v) {
     if (a.is_blank_ip()) {
       int port = a.get_port();
       for (auto& b : addrs.v) {
@@ -694,6 +699,7 @@ bool AsyncMessenger::set_addr_unknowns(const entity_addrvec_t &addrs)
       }
     }
   }
+  set_myaddrs(newaddrs);
   if (ret) {
     _init_local_connection();
   }
@@ -796,7 +802,8 @@ void AsyncMessenger::learned_addr(const entity_addr_t &peer_addr_for_me)
       ldout(cct,10) << __func__ << " had no addrs" << dendl;
     } else {
       // fix all addrs of the same family, regardless of type (msgr2 vs legacy)
-      for (auto& a : my_addrs->v) {
+      entity_addrvec_t newaddrs = *my_addrs;
+      for (auto& a : newaddrs.v) {
        if (a.get_family() == peer_addr_for_me.get_family()) {
          entity_addr_t t = peer_addr_for_me;
          t.set_type(a.get_type());
@@ -806,6 +813,7 @@ void AsyncMessenger::learned_addr(const entity_addr_t &peer_addr_for_me)
          a = t;
        }
       }
+      set_myaddrs(newaddrs);
     }
     ldout(cct, 1) << __func__ << " learned my addr " << *my_addrs
                  << " (peer_addr_for_me " << peer_addr_for_me << ")" << dendl;
index 829535e3eca00e5081d296ff0787873d2e589598..5e25e8b3fa9c08f9938a673b1fddd1bce6eb1c7d 100644 (file)
@@ -272,8 +272,9 @@ int Accepter::rebind(const set<int>& avoid_ports)
 
   // adjust the nonce; we want our entity_addr_t to be truly unique.
   nonce += 1000000;
-  msgr->my_addr.nonce = nonce;
-  msgr->my_addrs->v[0].nonce = nonce;
+  entity_addrvec_t newaddrs = *msgr->my_addrs;
+  newaddrs.v[0].nonce = nonce;
+  msgr->set_myaddrs(newaddrs);
   ldout(msgr->cct,10) << __func__ << " new nonce " << nonce << " and addr "
                        << msgr->my_addr << dendl;