]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
msg/Messenger: use mutable_item_history<> for my_addrs
authorSage Weil <sage@redhat.com>
Wed, 27 Jun 2018 13:34:07 +0000 (08:34 -0500)
committerSage Weil <sage@redhat.com>
Tue, 3 Jul 2018 18:01:24 +0000 (13:01 -0500)
We read this without a lock.

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

index 9f8937e6b3256619f7413f323801a6d76c1c469e..ebc64c34f618001c6ec771d9712e043ebf7ea97a 100644 (file)
@@ -29,6 +29,7 @@
 #include "include/types.h"
 #include "include/ceph_features.h"
 #include "auth/Crypto.h"
+#include "common/item_history.h"
 
 #include <errno.h>
 #include <sstream>
@@ -53,7 +54,7 @@ protected:
   entity_name_t my_name;
 
   /// my addr
-  entity_addrvec_t my_addrs;
+  mutable_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
@@ -151,10 +152,10 @@ public:
    * currently believes to be its own.
    */
   entity_addr_t get_myaddr() {
-    return my_addrs.front();
+    return my_addrs->front();
   }
   const entity_addrvec_t& get_myaddrs() {
-    return my_addrs;
+    return *my_addrs;
   }
 
   /**
index f69579cada04ac0e0c0e875120a3516bcdcd04e6..d4a74963e984535737020f30b5042e232d5827c0 100644 (file)
@@ -446,7 +446,7 @@ int AsyncMessenger::client_bind(const entity_addr_t &bind_addr)
     return 0;
   Mutex::Locker l(lock);
   if (did_bind) {
-    assert(my_addrs.legacy_addr() == bind_addr);
+    assert(my_addrs->legacy_addr() == bind_addr);
     return 0;
   }
   if (started) {
@@ -472,7 +472,7 @@ 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) {
+  for (auto& a : my_addrs->v) {
     a.set_nonce(nonce);
   }
 
@@ -495,7 +495,7 @@ int AsyncMessenger::start()
   stopped = false;
 
   if (!did_bind) {
-    for (auto& a : my_addrs.v) {
+    for (auto& a : my_addrs->v) {
       a.nonce = nonce;
     }
     _init_local_connection();
@@ -548,7 +548,7 @@ AsyncConnectionRef AsyncMessenger::create_connect(
   const entity_addrvec_t& addrs, int type)
 {
   assert(lock.is_locked());
-  assert(addrs != my_addrs);
+  assert(addrs != *my_addrs);
 
   ldout(cct, 10) << __func__ << " " << addrs
       << ", creating connection and registering" << dendl;
@@ -580,7 +580,7 @@ AsyncConnectionRef AsyncMessenger::create_connect(
 ConnectionRef AsyncMessenger::get_connection(const entity_inst_t& dest)
 {
   Mutex::Locker l(lock);
-  if (my_addrs.legacy_addr() == dest.addr) {
+  if (my_addrs->legacy_addr() == dest.addr) {
     // local
     return local_connection;
   }
@@ -649,7 +649,7 @@ void AsyncMessenger::submit_message(Message *m, AsyncConnectionRef con,
   }
 
   // local?
-  if (my_addrs.legacy_addr() == dest_addr) {
+  if (my_addrs->legacy_addr() == dest_addr) {
     // local
     local_connection->send_message(m);
     return ;
@@ -678,7 +678,7 @@ bool AsyncMessenger::set_addr_unknowns(const entity_addrvec_t &addrs)
   bool ret = false;
   Mutex::Locker l(lock);
 
-  for (auto& a : my_addrs.v) {
+  for (auto& a : my_addrs->v) {
     if (a.is_blank_ip()) {
       int port = a.get_port();
       for (auto& b : addrs.v) {
@@ -789,14 +789,14 @@ void AsyncMessenger::learned_addr(const entity_addr_t &peer_addr_for_me)
   lock.Lock();
   if (need_addr) {
     need_addr = false;
-    if (my_addrs.empty()) {
+    if (my_addrs->empty()) {
       auto a = peer_addr_for_me;
       a.set_nonce(nonce);
       set_myaddrs(entity_addrvec_t(a));
       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) {
+      for (auto& a : my_addrs->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());
@@ -807,7 +807,7 @@ void AsyncMessenger::learned_addr(const entity_addr_t &peer_addr_for_me)
        }
       }
     }
-    ldout(cct, 1) << __func__ << " learned my addr " << my_addrs
+    ldout(cct, 1) << __func__ << " learned my addr " << *my_addrs
                  << " (peer_addr_for_me " << peer_addr_for_me << ")" << dendl;
     _init_local_connection();
   }
index df748fbde713aee7a6771e944c2d731a8c24be29..bce7bc83517ea4ce4e24da78547c05442ef5f98f 100644 (file)
@@ -324,7 +324,7 @@ private:
 
   void _init_local_connection() {
     assert(lock.is_locked());
-    local_connection->peer_addrs = my_addrs;
+    local_connection->peer_addrs = *my_addrs;
     local_connection->peer_type = my_name.type();
     local_connection->set_features(CEPH_FEATURES_ALL);
     ms_deliver_handle_fast_connect(local_connection.get());
index 4216e59c1b0d576e2e9ae94e46b748772feb6a32..829535e3eca00e5081d296ff0787873d2e589598 100644 (file)
@@ -255,7 +255,7 @@ int Accepter::bind(const entity_addr_t &bind_addr, const set<int>& avoid_ports)
     return rc;
   }
 
-  ldout(msgr->cct,1) <<  __func__ << " my_addrs " << msgr->my_addrs
+  ldout(msgr->cct,1) <<  __func__ << " my_addrs " << *msgr->my_addrs
                     << " my_addr " << msgr->my_addr
                     << " need_addr=" << msgr->get_need_addr() << dendl;
   return 0;
@@ -273,7 +273,7 @@ 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;
+  msgr->my_addrs->v[0].nonce = nonce;
   ldout(msgr->cct,10) << __func__ << " new nonce " << nonce << " and addr "
                        << msgr->my_addr << dendl;
 
index 426a770ab276fef90562b85e45e47f570580e2ac..04a1c7812912c0300589e5fa31d5167efc4dfe81 100644 (file)
@@ -151,7 +151,7 @@ bool SimpleMessenger::set_addr_unknowns(const entity_addrvec_t &addrs)
 {
   bool ret = false;
   auto addr = addrs.legacy_addr();
-  assert(my_addr == my_addrs.front());
+  assert(my_addr == my_addrs->front());
   if (my_addr.is_blank_ip()) {
     ldout(cct,1) << __func__ << " " << addr << dendl;
     entity_addr_t t = my_addr;
@@ -164,7 +164,7 @@ bool SimpleMessenger::set_addr_unknowns(const entity_addrvec_t &addrs)
   } else {
     ldout(cct,1) << __func__ << " " << addr << " no-op" << dendl;
   }
-  assert(my_addr == my_addrs.front());
+  assert(my_addr == my_addrs->front());
   return ret;
 }
 
@@ -174,11 +174,11 @@ void SimpleMessenger::set_myaddrs(const entity_addrvec_t &av)
   my_addr.set_nonce(nonce);
   // do this in a slightly paranoid way because we update this value in a
   // thread-unsafe way.  SimpleMessenger sucks.
-  if (my_addrs.empty()) {
+  if (my_addrs->empty()) {
     Messenger::set_myaddrs(av);
   } else {
-    assert(my_addrs.v.size() == av.v.size());
-    my_addrs.v[0] = av.front();
+    assert(my_addrs->v.size() == av.v.size());
+    my_addrs->v[0] = av.front();
     set_endpoint_addr(av.front(), my_name);
   }
 }
@@ -347,7 +347,7 @@ int SimpleMessenger::client_bind(const entity_addr_t &bind_addr)
     return 0;
   Mutex::Locker l(lock);
   if (did_bind) {
-    assert(my_addrs == entity_addrvec_t(bind_addr));
+    assert(*my_addrs == entity_addrvec_t(bind_addr));
     return 0;
   }
   if (started) {
@@ -776,7 +776,7 @@ void SimpleMessenger::learned_addr(const entity_addr_t &peer_addr_for_me)
 
 void SimpleMessenger::init_local_connection()
 {
-  local_connection->peer_addrs = my_addrs;
+  local_connection->peer_addrs = *my_addrs;
   local_connection->peer_type = my_name.type();
   local_connection->set_features(CEPH_FEATURES_ALL);
   ms_deliver_handle_fast_connect(local_connection.get());