for (set<spg_t>::iterator p = pgs_to_check.begin();
p != pgs_to_check.end();
++p) {
- vector<int> acting;
- int nrep = osdmap->pg_to_acting_osds(p->pgid, acting);
- int role = osdmap->calc_pg_role(whoami, acting, nrep);
-
- if (role < 0) {
+ if (!(osdmap->is_acting_osd_shard(p->pgid, whoami, p->shard))) {
set<Session*> concerned_sessions;
get_sessions_possibly_interested_in_pg(*p, &concerned_sessions);
for (set<Session*>::iterator i = concerned_sessions.begin();
return group[group.size()-1];
return -1; // we fail!
}
+ bool is_acting_osd_shard(pg_t pg, int osd, shard_id_t shard) const {
+ vector<int> acting;
+ int nrep = pg_to_acting_osds(pg, acting);
+ if (shard == shard_id_t::NO_SHARD)
+ return calc_pg_role(osd, acting, nrep) >= 0;
+ if (shard >= (int)acting.size())
+ return false;
+ return acting[shard] == osd;
+ }
/* what replica # is a given osd? 0 primary, -1 for none. */