From: Xinze Chi Date: Wed, 29 Jul 2015 08:28:33 +0000 (+0800) Subject: bug fix: osd: requeue_scrub when kick_object_context_blocked X-Git-Tag: v9.1.0~192^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f77949fedce3449befd74efeb5270579f5085b16;p=ceph.git bug fix: osd: requeue_scrub when kick_object_context_blocked when read miss in writeback cache pool, osd do_proxy_read first and maybe promote it. but in this case, the op is not added to waiting_for_blocked_object. pg scrub maybe block by this object (_range_available_for_scrub). so after promote it, we should requeue_scrub. Fixes: 12515 Signed-off-by: Xinze Chi --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 08a29c735af..67a8a881185 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -8467,19 +8467,18 @@ void ReplicatedPG::add_object_context_to_pg_stat(ObjectContextRef obc, pg_stat_t void ReplicatedPG::kick_object_context_blocked(ObjectContextRef obc) { const hobject_t& soid = obc->obs.oi.soid; - map, hobject_t::BitwiseComparator>::iterator p = waiting_for_blocked_object.find(soid); - if (p == waiting_for_blocked_object.end()) - return; - if (obc->is_blocked()) { dout(10) << __func__ << " " << soid << " still blocked" << dendl; return; } - list& ls = p->second; - dout(10) << __func__ << " " << soid << " requeuing " << ls.size() << " requests" << dendl; - requeue_ops(ls); - waiting_for_blocked_object.erase(p); + map, hobject_t::BitwiseComparator>::iterator p = waiting_for_blocked_object.find(soid); + if (p != waiting_for_blocked_object.end()) { + list& ls = p->second; + dout(10) << __func__ << " " << soid << " requeuing " << ls.size() << " requests" << dendl; + requeue_ops(ls); + waiting_for_blocked_object.erase(p); + } map::iterator i = objects_blocked_on_snap_promotion.find(obc->obs.oi.soid.get_head());