]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
bug fix: osd: avoid multi set osd_op.outdata in tier pool 4895/head
authorXinze Chi <xmdxcxz@gmail.com>
Mon, 8 Jun 2015 08:54:08 +0000 (16:54 +0800)
committerXinze Chi <xmdxcxz@gmail.com>
Tue, 25 Aug 2015 14:59:18 +0000 (22:59 +0800)
There are two read op on the same object for ec pool. First op read
miss happend, calling do_proxy_read and promote_object, The second op only
do_proxy_read. but before first op process_copy_chunk finish, the second op
finish_proxy_read. first op receive reply from base pool
first and then second received. so the second op set the field "outdata"
in m->ops first. And then first op requeue_ops in process_copy_chunk,
At last in do_osd_ops, it append outdata field.

Fixes: 12540
Signed-off-by: Xinze Chi <xmdxcxz@gmail.com>
src/osd/ReplicatedPG.cc

index 08a29c735af7af4c2a4ca50cda023444f567e8f5..f05646b591a62215abc5b47eb8e3add5876c2536 100644 (file)
@@ -2240,6 +2240,9 @@ void ReplicatedPG::cancel_proxy_read(ProxyReadOpRef prdop)
   // cancel objecter op, if we can
   if (prdop->objecter_tid) {
     osd->objecter->op_cancel(prdop->objecter_tid, -ECANCELED);
+    for (uint32_t i = 0; i < prdop->ops.size(); i++) {
+      prdop->ops[i].outdata.clear();
+    }
     proxyread_ops.erase(prdop->objecter_tid);
     prdop->objecter_tid = 0;
   }
@@ -6697,7 +6700,6 @@ void ReplicatedPG::process_copy_chunk(hobject_t oid, ceph_tid_t tid, int r)
 
   // cancel and requeue proxy ops on this object
   if (!r) {
-    kick_proxy_ops_blocked(cobc->obs.oi.soid);
     for (map<ceph_tid_t, ProxyReadOpRef>::iterator it = proxyread_ops.begin();
        it != proxyread_ops.end(); ++it) {
       if (it->second->soid == cobc->obs.oi.soid) {
@@ -6710,6 +6712,7 @@ void ReplicatedPG::process_copy_chunk(hobject_t oid, ceph_tid_t tid, int r)
        cancel_proxy_write(it->second);
       }
     }
+    kick_proxy_ops_blocked(cobc->obs.oi.soid);
   }
 
   kick_object_context_blocked(cobc);