From b4fcd6d702a7691d86c67a140acc9d6f2436fe19 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 2 Jan 2018 21:26:52 -0600 Subject: [PATCH] osd/OSDMapMapping: a getter that returns a spg_t Note whether a pool is erasure so that we can generate an appropriate spg_t for a mapping. Signed-off-by: Sage Weil --- src/osd/OSDMapMapping.cc | 3 ++- src/osd/OSDMapMapping.h | 26 +++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/osd/OSDMapMapping.cc b/src/osd/OSDMapMapping.cc index beea0be130b..6566acaadb3 100644 --- a/src/osd/OSDMapMapping.cc +++ b/src/osd/OSDMapMapping.cc @@ -35,7 +35,8 @@ void OSDMapMapping::_init_mappings(const OSDMap& osdmap) } } pools.emplace(p.first, PoolMapping(p.second.get_size(), - p.second.get_pg_num())); + p.second.get_pg_num(), + p.second.is_erasure())); } pools.erase(q, pools.end()); assert(pools.size() == osdmap.get_pools().size()); diff --git a/src/osd/OSDMapMapping.h b/src/osd/OSDMapMapping.h index 794b26efc62..86ad9743b84 100644 --- a/src/osd/OSDMapMapping.h +++ b/src/osd/OSDMapMapping.h @@ -176,6 +176,7 @@ private: unsigned size = 0; unsigned pg_num = 0; + bool erasure = false; mempool::osdmap_mapping::vector table; size_t row_size() const { @@ -188,9 +189,10 @@ private: size; // up } - PoolMapping(int s, int p) + PoolMapping(int s, int p, bool e) : size(s), pg_num(p), + erasure(e), table(pg_num * row_size()) { } @@ -289,6 +291,28 @@ public: p->second.get(pgid.ps(), up, up_primary, acting, acting_primary); } + bool get_primary_and_shard(pg_t pgid, + int *acting_primary, + spg_t *spgid) { + auto p = pools.find(pgid.pool()); + assert(p != pools.end()); + assert(pgid.ps() < p->second.pg_num); + vector acting; + p->second.get(pgid.ps(), nullptr, nullptr, &acting, acting_primary); + if (p->second.erasure) { + for (uint8_t i = 0; i < acting.size(); ++i) { + if (acting[i] == *acting_primary) { + *spgid = spg_t(pgid, shard_id_t(i)); + return true; + } + } + return false; + } else { + *spgid = spg_t(pgid); + return true; + } + } + const mempool::osdmap_mapping::vector& get_osd_acting_pgs(unsigned osd) { assert(osd < acting_rmap.size()); return acting_rmap[osd]; -- 2.39.5