From a774d5002132cffb7b408e7de3d75ee841301fbf Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 6 Jan 2012 17:18:01 -0800 Subject: [PATCH] osd: clean up src_oid, src_obc map key calculation Be consistent about how we generate the src_oid and src_oloc, so that we feed good value into find_object_context and use a consistent key for the src_obc map<>. This fixes a crash in do_osd_ops() due to a missing src_obc key when the get_src_oloc() normalizes the key in do_op() but not in do_osd_ops(). Also use a nicer name. Fixes: #1897 Signed-off-by: Sage Weil --- src/osd/ReplicatedPG.cc | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index d68169c4757c6..a03b27b32ceaf 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -584,15 +584,12 @@ void ReplicatedPG::do_op(MOSDOp *op) if (osd_op.soid.oid.name.length()) { object_locator_t src_oloc; get_src_oloc(op->get_oid(), op->get_object_locator(), src_oloc); - hobject_t toid(osd_op.soid, src_oloc.key, op->get_pg().ps()); - if (!src_obc.count(toid)) { + hobject_t src_oid(osd_op.soid, src_oloc.key, op->get_pg().ps()); + if (!src_obc.count(src_oid)) { ObjectContext *sobc; snapid_t ssnapid; - int r = find_object_context(hobject_t(toid.oid, src_oloc.key, - toid.snap, op->get_pg().ps()), - src_oloc, - &sobc, false, &ssnapid); + int r = find_object_context(src_oid, src_oloc, &sobc, false, &ssnapid); if (r == -EAGAIN) { // missing the specific snap we need; requeue and wait. hobject_t wait_oid(osd_op.soid.oid, src_oloc.key, ssnapid, op->get_pg().ps()); @@ -615,7 +612,8 @@ void ReplicatedPG::do_op(MOSDOp *op) sobc->get(); sobc->blocking.insert(obc); } else { - src_obc[toid] = sobc; + dout(10) << " src_oid " << src_oid << " obc " << src_obc << dendl; + src_obc[src_oid] = sobc; continue; } // Error cleanup below @@ -1401,9 +1399,11 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops, ObjectContext *src_obc = 0; if (ceph_osd_op_type_multi(op.op)) { - src_obc = ctx->src_obc[hobject_t(osd_op.soid, - ((MOSDOp *)ctx->op)->get_object_locator().key, - soid.hash)]; + object_locator_t src_oloc; + get_src_oloc(soid.oid, ((MOSDOp *)ctx->op)->get_object_locator(), src_oloc); + hobject_t src_oid(osd_op.soid, src_oloc.key, soid.hash); + src_obc = ctx->src_obc[src_oid]; + dout(10) << " src_oid " << src_oid << " obc " << src_obc << dendl; assert(src_obc); } -- 2.39.5