From: Samuel Just Date: Thu, 23 Jan 2014 22:52:01 +0000 (-0800) Subject: OSDMap: fill in get_primary_shard X-Git-Tag: v0.78~163^2~29 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=109b3c9e7f152e0d58b60e1c91e417a58fee7be8;p=ceph.git OSDMap: fill in get_primary_shard Signed-off-by: Samuel Just --- diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index 47ac2f796cfc..a5d0869afa98 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -627,7 +627,27 @@ public: assert(i != pools.end()); return i->second.ec_pool(); } - spg_t get_primary_shard(pg_t pgid) const { return spg_t(); /* TODOSAM: fix */} + bool get_primary_shard(pg_t pgid, spg_t *out) const { + map::const_iterator i = get_pools().find(pgid.pool()); + if (i == get_pools().end()) { + return false; + } + int primary; + vector acting; + pg_to_acting_osds(pgid, &acting, &primary); + if (i->second.ec_pool()) { + for (shard_id_t i = 0; i < acting.size(); ++i) { + if (acting[i] == primary) { + *out = spg_t(pgid, i); + return true; + } + } + } else { + *out = spg_t(pgid); + return true; + } + return false; + } int64_t lookup_pg_pool_name(const string& name) { if (name_pool.count(name)) diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 026d7c51c0c1..fe0493436b5a 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -67,6 +67,7 @@ struct pg_shard_t { int osd; shard_id_t shard; pg_shard_t() : osd(-1), shard(ghobject_t::NO_SHARD) {} + explicit pg_shard_t(int osd) : osd(osd), shard(ghobject_t::NO_SHARD) {} pg_shard_t(int osd, shard_id_t shard) : osd(osd), shard(shard) {} static pg_shard_t undefined_shard() { return pg_shard_t(-1, ghobject_t::NO_SHARD);