From: Sage Weil Date: Wed, 27 Jun 2018 13:40:24 +0000 (-0500) Subject: msg/Messenger: use safe_item_history<> for my_addrs X-Git-Tag: v14.0.1~951^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=73c4d4a9b3c5370dafea47b68277629ef5dd0f9e;p=ceph.git msg/Messenger: use safe_item_history<> for my_addrs Mutating the item in place is not safe. Signed-off-by: Sage Weil --- diff --git a/src/msg/Messenger.h b/src/msg/Messenger.h index ebc64c34f61..ee645e7cc1a 100644 --- a/src/msg/Messenger.h +++ b/src/msg/Messenger.h @@ -54,7 +54,7 @@ protected: entity_name_t my_name; /// my addr - mutable_item_history my_addrs; + safe_item_history my_addrs; int default_send_priority; /// set to true once the Messenger has started, and set to false on shutdown diff --git a/src/msg/async/AsyncMessenger.cc b/src/msg/async/AsyncMessenger.cc index d4a74963e98..48922b9c489 100644 --- a/src/msg/async/AsyncMessenger.cc +++ b/src/msg/async/AsyncMessenger.cc @@ -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; diff --git a/src/msg/simple/Accepter.cc b/src/msg/simple/Accepter.cc index 829535e3eca..5e25e8b3fa9 100644 --- a/src/msg/simple/Accepter.cc +++ b/src/msg/simple/Accepter.cc @@ -272,8 +272,9 @@ int Accepter::rebind(const set& 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;