]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/ReplicatedPG: fix iterator corruption in cancel_copy_ops() 663/head
authorSage Weil <sage@inktank.com>
Mon, 30 Sep 2013 23:33:22 +0000 (16:33 -0700)
committerSage Weil <sage@inktank.com>
Tue, 1 Oct 2013 15:56:12 +0000 (08:56 -0700)
The cancel_copy() method removes the entry from copy_ops.  Move the
iterator forward before calling.

Fixes segfault when thrashing osds with a copy-from workload.

Signed-off-by: Sage Weil <sage@inktank.com>
src/osd/ReplicatedPG.cc

index 5e099c0853d4723009456a4f2f6f9c6912a40513..fcaca434ba895ddbc9267ba2628007bc7d0a8f17 100644 (file)
@@ -4583,10 +4583,9 @@ void ReplicatedPG::cancel_copy(CopyOpRef cop)
 void ReplicatedPG::cancel_copy_ops()
 {
   dout(10) << __func__ << dendl;
-  for (map<hobject_t,CopyOpRef>::iterator p = copy_ops.begin();
-       p != copy_ops.end();
-       copy_ops.erase(p++)) {
-    cancel_copy(p->second);
+  map<hobject_t,CopyOpRef>::iterator p = copy_ops.begin();
+  while (p != copy_ops.end()) {
+    cancel_copy((p++)->second);
   }
 }