We read this without a lock.
Signed-off-by: Sage Weil <sage@redhat.com>
#include "include/types.h"
#include "include/ceph_features.h"
#include "auth/Crypto.h"
+#include "common/item_history.h"
#include <errno.h>
#include <sstream>
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
* 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;
}
/**
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) {
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);
}
stopped = false;
if (!did_bind) {
- for (auto& a : my_addrs.v) {
+ for (auto& a : my_addrs->v) {
a.nonce = nonce;
}
_init_local_connection();
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;
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;
}
}
// local?
- if (my_addrs.legacy_addr() == dest_addr) {
+ if (my_addrs->legacy_addr() == dest_addr) {
// local
local_connection->send_message(m);
return ;
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) {
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());
}
}
}
- 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();
}
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());
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;
// 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;
{
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;
} else {
ldout(cct,1) << __func__ << " " << addr << " no-op" << dendl;
}
- assert(my_addr == my_addrs.front());
+ assert(my_addr == my_addrs->front());
return ret;
}
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);
}
}
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) {
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());