From 71a42f7c3aa55de688ef16ea7e392573fa5a7e62 Mon Sep 17 00:00:00 2001 From: Xinze Chi Date: Mon, 8 Jun 2015 16:54:08 +0800 Subject: [PATCH] bug fix: osd: avoid multi set osd_op.outdata in tier pool 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 (cherry picked from commit 855ae1fd6e4557adba1cbd8ab532488b867cee2a) Conflicts: src/osd/ReplicatedPG.cc --- src/osd/ReplicatedPG.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 4e001921319a7..d34c0c4277471 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -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::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); -- 2.39.5