From: Sage Weil Date: Tue, 13 Jan 2015 14:28:41 +0000 (-0800) Subject: osd/ReplicatedPG: fix cancel_proxy_read_ops X-Git-Tag: v0.93~216^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=792ac7c4f0bd4df8113e628b24b359906f705c1f;p=ceph.git osd/ReplicatedPG: fix cancel_proxy_read_ops Two issues: 1) We invalidate the iterator when we delete the item 2) In the requeue==false case we should still clear the list. ** CID 1262557: Using invalid iterator (INVALIDATE_ITERATOR) /osd/ReplicatedPG.cc: 2071 in ReplicatedPG::cancel_proxy_read_ops(bool)() Signed-off-by: Sage Weil --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index bea2a5f032c5..38a1b35dca55 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -2067,13 +2067,17 @@ void ReplicatedPG::cancel_proxy_read_ops(bool requeue) } if (requeue) { - for (map >::iterator p = in_progress_proxy_reads.begin(); - p != in_progress_proxy_reads.end(); p++) { + map >::iterator p = + in_progress_proxy_reads.begin(); + while (p != in_progress_proxy_reads.end()) { list& ls = p->second; - dout(10) << __func__ << " " << p->first << " requeuing " << ls.size() << " requests" << dendl; + dout(10) << __func__ << " " << p->first << " requeuing " << ls.size() + << " requests" << dendl; requeue_ops(ls); - in_progress_proxy_reads.erase(p); + in_progress_proxy_reads.erase(p++); } + } else { + in_progress_proxy_reads.clear(); } }