]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
bug fix: osd: avoid multi set osd_op.outdata in tier pool 6060/head
authorXinze Chi <xmdxcxz@gmail.com>
Mon, 8 Jun 2015 08:54:08 +0000 (16:54 +0800)
committerXinze Chi <xinze@xsky.com>
Thu, 24 Sep 2015 02:41:00 +0000 (10:41 +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>
(cherry picked from commit 855ae1fd6e4557adba1cbd8ab532488b867cee2a)

Conflicts:
src/osd/ReplicatedPG.cc

src/osd/ReplicatedPG.cc

index 4e001921319a7f13589f86911ba74b13709673e3..d34c0c42774713cb6a965b68f3f28b2ea8279a19 100644 (file)
@@ -2098,6 +2098,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;
   }
@@ -6321,13 +6324,13 @@ void ReplicatedPG::process_copy_chunk(hobject_t oid, ceph_tid_t tid, int r)
   copy_ops.erase(cobc->obs.oi.soid);
   cobc->stop_block();
 
-  // cancel and requeue proxy reads on this object
-  kick_proxy_read_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) {
       cancel_proxy_read(it->second);
     }
+    // cancel and requeue proxy reads on this object
+    kick_proxy_read_blocked(cobc->obs.oi.soid);
   }
 
   kick_object_context_blocked(cobc);