]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/ReplicatedPG: fix cancel_proxy_read_ops
authorSage Weil <sage@redhat.com>
Tue, 13 Jan 2015 14:28:41 +0000 (06:28 -0800)
committerSage Weil <sage@redhat.com>
Tue, 13 Jan 2015 14:28:41 +0000 (06:28 -0800)
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 <sage@redhat.com>
src/osd/ReplicatedPG.cc

index bea2a5f032c5d13d128586abb72f66840918c849..38a1b35dca5521e340747aaf687ebb824ec36696 100644 (file)
@@ -2067,13 +2067,17 @@ void ReplicatedPG::cancel_proxy_read_ops(bool requeue)
   }
 
   if (requeue) {
-    for (map<hobject_t, list<OpRequestRef> >::iterator p = in_progress_proxy_reads.begin();
-       p != in_progress_proxy_reads.end(); p++) {
+    map<hobject_t, list<OpRequestRef> >::iterator p =
+      in_progress_proxy_reads.begin();
+    while (p != in_progress_proxy_reads.end()) {
       list<OpRequestRef>& 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();
   }
 }