From: Samuel Just Date: Thu, 7 Jan 2016 16:09:46 +0000 (-0800) Subject: OSD::consume_map: correctly remove pg shards which are no longer acting X-Git-Tag: v10.0.4~50^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bd2fdf8c56c1aeed6cea3eb59046dbb6af470111;p=ceph.git OSD::consume_map: correctly remove pg shards which are no longer acting A particular shard may be non-active even if the osd is in the acting set. Fixes: 14278 Backport: hammer Signed-off-by: Samuel Just --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 1d0ca9c57f21..80f988596299 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -6871,11 +6871,7 @@ void OSD::consume_map() for (set::iterator p = pgs_to_check.begin(); p != pgs_to_check.end(); ++p) { - vector 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 concerned_sessions; get_sessions_possibly_interested_in_pg(*p, &concerned_sessions); for (set::iterator i = concerned_sessions.begin(); diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index e929b72ce174..0c5309ddea6d 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -776,6 +776,15 @@ public: 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 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. */