From: Sage Weil Date: Wed, 24 May 2017 17:33:42 +0000 (-0400) Subject: osd/OSDMap: encapsulate pg_temp X-Git-Tag: ses5-milestone6~11^2^2^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3630165609049c3e689d49e051b153c7cf97d3be;p=ceph.git osd/OSDMap: encapsulate pg_temp Signed-off-by: Sage Weil --- diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index e28621cffaf..f4f7c95a17e 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -2674,7 +2674,7 @@ bool OSDMonitor::preprocess_pgtemp(MonOpRequestRef op) for (auto p = m->pg_temp.begin(); p != m->pg_temp.end(); ++p) { dout(20) << " " << p->first - << (osdmap.pg_temp->count(p->first) ? (*osdmap.pg_temp)[p->first] : empty) + << (osdmap.pg_temp->count(p->first) ? osdmap.pg_temp->get(p->first) : empty) << " -> " << p->second << dendl; // does the pool exist? @@ -2718,7 +2718,7 @@ bool OSDMonitor::preprocess_pgtemp(MonOpRequestRef op) // an existing pg_primary field to imply a change if (p->second.size() && (osdmap.pg_temp->count(p->first) == 0 || - !vectors_equal((*osdmap.pg_temp)[p->first], p->second) || + !vectors_equal(osdmap.pg_temp->get(p->first), p->second) || osdmap.primary_temp->count(p->first))) return false; } diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index cbeb791ff66..e73a63d985e 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -1383,10 +1383,8 @@ void OSDMap::dedup(const OSDMap *o, OSDMap *n) } // does pg_temp match? - if (o->pg_temp->size() == n->pg_temp->size()) { - if (*o->pg_temp == *n->pg_temp) - n->pg_temp = o->pg_temp; - } + if (*o->pg_temp == *n->pg_temp) + n->pg_temp = o->pg_temp; // does primary_temp match? if (o->primary_temp->size() == n->primary_temp->size()) { @@ -1618,7 +1616,7 @@ int OSDMap::apply_incremental(const Incremental &inc) if (pg.second.empty()) pg_temp->erase(pg.first); else - (*pg_temp)[pg.first] = pg.second; + pg_temp->set(pg.first, pg.second); } for (const auto &pg : inc.new_primary_temp) { @@ -2352,7 +2350,9 @@ void OSDMap::decode_classic(bufferlist::iterator& p) while (n--) { old_pg_t opg; ::decode_raw(opg, p); - ::decode((*pg_temp)[pg_t(opg)], p); + mempool::osdmap::vector v; + ::decode(v, p); + pg_temp->set(pg_t(opg), v); } } else { ::decode(*pg_temp, p); @@ -2661,15 +2661,7 @@ void OSDMap::dump(Formatter *f) const } f->close_section(); f->open_array_section("pg_temp"); - for (const auto &pg : *pg_temp) { - f->open_object_section("osds"); - f->dump_stream("pgid") << pg.first; - f->open_array_section("osds"); - for (const auto osd : pg.second) - f->dump_int("osd", osd); - f->close_section(); - f->close_section(); - } + pg_temp->dump(f); f->close_section(); f->open_array_section("primary_temp"); diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index 5d1819df332..374b0a06afb 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -114,6 +114,91 @@ WRITE_CLASS_ENCODER(osd_xinfo_t) ostream& operator<<(ostream& out, const osd_xinfo_t& xi); +struct PGTempMap { + mempool::osdmap::map > pg_temp; + + void encode(bufferlist& bl) const { + ::encode(pg_temp, bl); + } + void decode(bufferlist::iterator& p) { + ::decode(pg_temp, p); + } + friend bool operator==(const PGTempMap& l, const PGTempMap& r) { + return + l.pg_temp.size() == r.pg_temp.size() && + l.pg_temp == r.pg_temp; + } + + class iterator { + mempool::osdmap::map >::const_iterator it; + public: + iterator(mempool::osdmap::map >::const_iterator p) + : it(p) {} + + pair&> operator*() const { + return *it; + } + const pair>* operator->() const { + return &*it; + } + friend bool operator==(const iterator& l, const iterator& r) { + return l.it == r.it; + } + friend bool operator!=(const iterator& l, const iterator& r) { + return l.it != r.it; + } + iterator& operator++() { + ++it; + return *this; + } + iterator operator++(int) { + iterator r = *this; + ++it; + return r; + } + }; + iterator begin() const { + return iterator(pg_temp.cbegin()); + } + iterator end() const { + return iterator(pg_temp.cend()); + } + iterator find(pg_t pgid) const { + return iterator(pg_temp.find(pgid)); + } + size_t size() const { + return pg_temp.size(); + } + size_t count(pg_t pgid) const { + return pg_temp.count(pgid); + } + void erase(pg_t pgid) { + pg_temp.erase(pgid); + } + void clear() { + pg_temp.clear(); + } + void set(pg_t pgid, const mempool::osdmap::vector& v) { + pg_temp[pgid] = v; + } + const mempool::osdmap::vector& get(pg_t pgid) { + return pg_temp.at(pgid); + } + void dump(Formatter *f) const { + for (const auto &pg : *this) { + f->open_object_section("osds"); + f->dump_stream("pgid") << pg.first; + f->open_array_section("osds"); + for (const auto osd : pg.second) + f->dump_int("osd", osd); + f->close_section(); + f->close_section(); + } + } +}; +WRITE_CLASS_ENCODER(PGTempMap) + /** OSDMap */ class OSDMap { @@ -248,7 +333,7 @@ private: mempool::osdmap::vector<__u32> osd_weight; // 16.16 fixed point, 0x10000 = "in", 0 = "out" mempool::osdmap::vector osd_info; - ceph::shared_ptr< mempool::osdmap::map > > pg_temp; // temp pg mapping (e.g. while we rebuild) + ceph::shared_ptr pg_temp; // temp pg mapping (e.g. while we rebuild) ceph::shared_ptr< mempool::osdmap::map > primary_temp; // temp primary mapping (e.g. while we rebuild) ceph::shared_ptr< mempool::osdmap::vector<__u32> > osd_primary_affinity; ///< 16.16 fixed point, 0x10000 = baseline @@ -297,7 +382,7 @@ private: num_osd(0), num_up_osd(0), num_in_osd(0), max_osd(0), osd_addrs(std::make_shared()), - pg_temp(std::make_shared>>()), + pg_temp(std::make_shared()), primary_temp(std::make_shared>()), osd_uuid(std::make_shared>()), cluster_snapshot_epoch(0), @@ -317,7 +402,7 @@ public: void deepish_copy_from(const OSDMap& o) { *this = o; primary_temp.reset(new mempool::osdmap::map(*o.primary_temp)); - pg_temp.reset(new mempool::osdmap::map >(*o.pg_temp)); + pg_temp.reset(new PGTempMap(*o.pg_temp)); osd_uuid.reset(new mempool::osdmap::vector(*o.osd_uuid)); if (o.osd_primary_affinity)