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: v0.94.6~91^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e8cce089102abd8ec1b8e916c6f2c4a5b339cbd3;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 (cherry picked from commit f77949fedce3449befd74efeb5270579f5085b16) Conflicts: src/osd/ReplicatedPG.cc in ReplicatedPG::kick_object_context_blocked, removed hobject_t::BitwiseComparator from map p --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 6b22c3a845a..fd20cf96426 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -8088,19 +8088,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 >::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 >::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); + } if (obc->requeue_scrub_on_unblock) osd->queue_for_scrub(this);