From b47d9135d5345816037899cd1d12a5a20b54e6c1 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 30 May 2018 16:13:32 -0500 Subject: [PATCH] osd/OSDMap: switch to addrvec for public_addr Signed-off-by: Sage Weil --- src/mon/OSDMonitor.cc | 10 +++----- src/osd/OSDMap.cc | 38 ++++++++++++++-------------- src/osd/OSDMap.h | 32 +++++++++++++---------- src/test/mon/test_mon_workloadgen.cc | 2 +- src/test/osd/TestOSDMap.cc | 2 +- 5 files changed, 44 insertions(+), 40 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 7a451604ff1c9..f0400c2a0d1c6 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -1256,7 +1256,7 @@ void OSDMonitor::encode_pending(MonitorDBStore::TransactionRef t) if (s & CEPH_OSD_EXISTS) dout(2) << " osd." << i->first << " DNE" << dendl; } - for (map::iterator i = pending_inc.new_up_client.begin(); + for (auto i = pending_inc.new_up_client.begin(); i != pending_inc.new_up_client.end(); ++i) { //FIXME: insert cluster addresses too @@ -2758,12 +2758,10 @@ bool OSDMonitor::prepare_boot(MonOpRequestRef op) wait_for_finished_proposal(op, new C_RetryMessage(this, op)); } else { // mark new guy up. - pending_inc.new_up_client[from] = m->get_orig_source_addr(); - if (!m->cluster_addr.is_blank_ip()) - pending_inc.new_up_cluster[from] = m->cluster_addr; + pending_inc.new_up_client[from] = m->get_orig_source_addrs(); + pending_inc.new_up_cluster[from] = m->cluster_addr; pending_inc.new_hb_back_up[from] = m->hb_back_addr; - if (!m->hb_front_addr.is_blank_ip()) - pending_inc.new_hb_front_up[from] = m->hb_front_addr; + pending_inc.new_hb_front_up[from] = m->hb_front_addr; down_pending_out.erase(from); // if any diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 7be113a0efc56..75605d2ef98b4 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -915,7 +915,8 @@ void OSDMap::Incremental::dump(Formatter *f) const for (const auto &upclient : new_up_client) { f->open_object_section("osd"); f->dump_int("osd", upclient.first); - f->dump_stream("public_addr") << upclient.second; + f->dump_stream("public_addr") << upclient.second.legacy_addr(); + f->dump_object("public_addrs", upclient.second); f->dump_stream("cluster_addr") << new_up_cluster.find(upclient.first)->second; f->dump_stream("heartbeat_back_addr") << new_hb_back_up.find(upclient.first)->second; map::const_iterator q; @@ -1174,7 +1175,7 @@ void OSDMap::set_max_osd(int m) } osd_info.resize(m); osd_xinfo.resize(m); - osd_addrs->client_addr.resize(m); + osd_addrs->client_addrs.resize(m); osd_addrs->cluster_addr.resize(m); osd_addrs->hb_back_addr.resize(m); osd_addrs->hb_front_addr.resize(m); @@ -1497,9 +1498,9 @@ void OSDMap::dedup(const OSDMap *o, OSDMap *n) if (o->max_osd != n->max_osd) diff++; for (int i = 0; i < o->max_osd && i < n->max_osd; i++) { - if ( n->osd_addrs->client_addr[i] && o->osd_addrs->client_addr[i] && - *n->osd_addrs->client_addr[i] == *o->osd_addrs->client_addr[i]) - n->osd_addrs->client_addr[i] = o->osd_addrs->client_addr[i]; + if ( n->osd_addrs->client_addrs[i] && o->osd_addrs->client_addrs[i] && + *n->osd_addrs->client_addrs[i] == *o->osd_addrs->client_addrs[i]) + n->osd_addrs->client_addrs[i] = o->osd_addrs->client_addrs[i]; else diff++; if ( n->osd_addrs->cluster_addr[i] && o->osd_addrs->cluster_addr[i] && @@ -1872,7 +1873,7 @@ int OSDMap::apply_incremental(const Incremental &inc) osd_info[osd] = osd_info_t(); osd_xinfo[osd] = osd_xinfo_t(); set_primary_affinity(osd, CEPH_OSD_DEFAULT_PRIMARY_AFFINITY); - osd_addrs->client_addr[osd].reset(new entity_addr_t()); + osd_addrs->client_addrs[osd].reset(new entity_addrvec_t()); osd_addrs->cluster_addr[osd].reset(new entity_addr_t()); osd_addrs->hb_front_addr[osd].reset(new entity_addr_t()); osd_addrs->hb_back_addr[osd].reset(new entity_addr_t()); @@ -1884,12 +1885,10 @@ int OSDMap::apply_incremental(const Incremental &inc) for (const auto &client : inc.new_up_client) { osd_state[client.first] |= CEPH_OSD_EXISTS | CEPH_OSD_UP; - osd_addrs->client_addr[client.first].reset(new entity_addr_t(client.second)); - if (inc.new_hb_back_up.empty()) - osd_addrs->hb_back_addr[client.first].reset(new entity_addr_t(client.second)); //this is a backward-compatibility hack - else - osd_addrs->hb_back_addr[client.first].reset( - new entity_addr_t(inc.new_hb_back_up.find(client.first)->second)); + osd_addrs->client_addrs[client.first].reset( + new entity_addrvec_t(client.second)); + osd_addrs->hb_back_addr[client.first].reset( + new entity_addr_t(inc.new_hb_back_up.find(client.first)->second)); const auto j = inc.new_hb_front_up.find(client.first); if (j != inc.new_hb_front_up.end()) osd_addrs->hb_front_addr[client.first].reset(new entity_addr_t(j->second)); @@ -2452,7 +2451,7 @@ void OSDMap::encode_client_old(bufferlist& bl) const } } encode(osd_weight, bl); - encode(osd_addrs->client_addr, bl, 0); + encode(osd_addrs->client_addrs, bl, 0); // for encode(pg_temp, bl); n = pg_temp->size(); @@ -2501,7 +2500,7 @@ void OSDMap::encode_classic(bufferlist& bl, uint64_t features) const } } encode(osd_weight, bl); - encode(osd_addrs->client_addr, bl, features); + encode(osd_addrs->client_addrs, bl, features); encode(*pg_temp, bl); @@ -2590,7 +2589,7 @@ void OSDMap::encode(bufferlist& bl, uint64_t features) const } } encode(osd_weight, bl); - encode(osd_addrs->client_addr, bl, features); + encode(osd_addrs->client_addrs, bl, features); encode(*pg_temp, bl); encode(*primary_temp, bl); @@ -2754,7 +2753,7 @@ void OSDMap::decode_classic(bufferlist::const_iterator& p) } } decode(osd_weight, p); - decode(osd_addrs->client_addr, p); + decode(osd_addrs->client_addrs, p); if (v <= 5) { pg_temp->clear(); decode(n, p); @@ -2788,7 +2787,7 @@ void OSDMap::decode_classic(bufferlist::const_iterator& p) if (ev >= 6) decode(osd_addrs->cluster_addr, p); else - osd_addrs->cluster_addr.resize(osd_addrs->client_addr.size()); + osd_addrs->cluster_addr.resize(osd_addrs->client_addrs.size()); if (ev >= 7) { decode(cluster_snapshot_epoch, p); @@ -2865,7 +2864,7 @@ void OSDMap::decode(bufferlist::const_iterator& bl) } } decode(osd_weight, bl); - decode(osd_addrs->client_addr, bl); + decode(osd_addrs->client_addrs, bl); decode(*pg_temp, bl); decode(*primary_temp, bl); @@ -3073,7 +3072,8 @@ void OSDMap::dump(Formatter *f) const f->dump_float("weight", get_weightf(i)); f->dump_float("primary_affinity", get_primary_affinityf(i)); get_info(i).dump(f); - f->dump_object("public_addr", get_addrs(i)); + f->dump_stream("public_addr") << get_addrs(i).legacy_addr(); + f->dump_object("public_addrs", get_addrs(i)); f->dump_stream("cluster_addr") << get_cluster_addr(i); f->dump_stream("heartbeat_back_addr") << get_hb_back_addr(i); f->dump_stream("heartbeat_front_addr") << get_hb_front_addr(i); diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index d58c052f9d000..e18407fc022b7 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -375,7 +375,7 @@ public: mempool::osdmap::set old_pools; mempool::osdmap::map > new_erasure_code_profiles; mempool::osdmap::vector old_erasure_code_profiles; - mempool::osdmap::map new_up_client; + mempool::osdmap::map new_up_client; mempool::osdmap::map new_up_cluster; mempool::osdmap::map new_state; // XORed onto previous state. mempool::osdmap::map new_weight; @@ -524,14 +524,16 @@ private: CEPH_FEATUREMASK_SERVER_NAUTILUS; struct addrs_s { - mempool::osdmap::vector > client_addr; + mempool::osdmap::vector > client_addrs; mempool::osdmap::vector > cluster_addr; mempool::osdmap::vector > hb_back_addr; mempool::osdmap::vector > hb_front_addr; - entity_addr_t blank; }; ceph::shared_ptr osd_addrs; + entity_addr_t _blank_addr; + entity_addrvec_t _blank_addrvec; + mempool::osdmap::vector<__u32> osd_weight; // 16.16 fixed point, 0x10000 = "in", 0 = "out" mempool::osdmap::vector osd_info; ceph::shared_ptr pg_temp; // temp pg mapping (e.g. while we rebuild) @@ -892,26 +894,28 @@ public: } int find_osd_on_ip(const entity_addr_t& ip) const; - entity_addrvec_t get_addrs(int osd) const { + const entity_addrvec_t& get_addrs(int osd) const { assert(exists(osd)); - return entity_addrvec_t(osd_addrs->client_addr[osd] ? *osd_addrs->client_addr[osd] : osd_addrs->blank); + return osd_addrs->client_addrs[osd] ? + *osd_addrs->client_addrs[osd] : _blank_addrvec; } entity_addrvec_t get_cluster_addrs(int osd) const { assert(exists(osd)); - if (!osd_addrs->cluster_addr[osd] || *osd_addrs->cluster_addr[osd] == entity_addr_t()) - return get_addrs(osd); + if (!osd_addrs->cluster_addr[osd]) + return entity_addrvec_t(); return entity_addrvec_t(*osd_addrs->cluster_addr[osd]); } entity_addrvec_t get_hb_back_addrs(int osd) const { assert(exists(osd)); - return entity_addrvec_t(osd_addrs->hb_back_addr[osd] ? *osd_addrs->hb_back_addr[osd] : osd_addrs->blank); + return entity_addrvec_t(osd_addrs->hb_back_addr[osd] ? + *osd_addrs->hb_back_addr[osd] : _blank_addr); } entity_addrvec_t get_hb_front_addrs(int osd) const { assert(exists(osd)); - return entity_addrvec_t(osd_addrs->hb_front_addr[osd] ? *osd_addrs->hb_front_addr[osd] : osd_addrs->blank); + return entity_addrvec_t(osd_addrs->hb_front_addr[osd] ? + *osd_addrs->hb_front_addr[osd] : _blank_addr); } - entity_addrvec_t get_most_recent_addrs(int osd) const { - assert(exists(osd)); + const entity_addrvec_t& get_most_recent_addrs(int osd) const { return get_addrs(osd); } @@ -922,11 +926,13 @@ public: } const entity_addr_t &get_hb_back_addr(int osd) const { assert(exists(osd)); - return osd_addrs->hb_back_addr[osd] ? *osd_addrs->hb_back_addr[osd] : osd_addrs->blank; + return osd_addrs->hb_back_addr[osd] ? + *osd_addrs->hb_back_addr[osd] : _blank_addr; } const entity_addr_t &get_hb_front_addr(int osd) const { assert(exists(osd)); - return osd_addrs->hb_front_addr[osd] ? *osd_addrs->hb_front_addr[osd] : osd_addrs->blank; + return osd_addrs->hb_front_addr[osd] ? + *osd_addrs->hb_front_addr[osd] : _blank_addr; } const uuid_d& get_uuid(int osd) const { diff --git a/src/test/mon/test_mon_workloadgen.cc b/src/test/mon/test_mon_workloadgen.cc index 7306ba334698e..1b968d33650f4 100644 --- a/src/test/mon/test_mon_workloadgen.cc +++ b/src/test/mon/test_mon_workloadgen.cc @@ -854,7 +854,7 @@ class OSDStub : public TestStub *_dout << dendl; if (osdmap.is_up(whoami) && - osdmap.get_addr(whoami) == messenger->get_myaddr()) { + osdmap.get_addrs(whoami) == messenger->get_myaddrs()) { dout(1) << __func__ << " got into the osdmap and we're up!" << dendl; } diff --git a/src/test/osd/TestOSDMap.cc b/src/test/osd/TestOSDMap.cc index fbea1a4783129..8a690f9963b3c 100644 --- a/src/test/osd/TestOSDMap.cc +++ b/src/test/osd/TestOSDMap.cc @@ -48,7 +48,7 @@ public: sample_uuid.generate_random(); sample_addr.nonce = i; pending_inc.new_state[i] = CEPH_OSD_EXISTS | CEPH_OSD_NEW; - pending_inc.new_up_client[i] = sample_addr; + pending_inc.new_up_client[i] = entity_addrvec_t(sample_addr); pending_inc.new_up_cluster[i] = sample_addr; pending_inc.new_hb_back_up[i] = sample_addr; pending_inc.new_hb_front_up[i] = sample_addr; -- 2.39.5