From: Yehuda Sadeh Date: Fri, 16 Sep 2011 18:18:03 +0000 (-0700) Subject: osd: use target obj locator for source object if empty X-Git-Tag: v0.35~7 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=7d3aa0e5586387e3810bf0fb56c28bfbb31d9dd4;p=ceph.git osd: use target obj locator for source object if empty --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 26c2f3c2c8cf0..a615abc70695b 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -383,6 +383,13 @@ ReplicatedPG::ReplicatedPG(OSD *o, PGPool *_pool, pg_t p, const hobject_t& oid, snap_trimmer_machine.initiate(); } +void ReplicatedPG::get_src_oloc(const object_t& oid, const object_locator_t& oloc, object_locator_t& src_oloc) +{ + src_oloc = oloc; + if (oloc.key.empty()) + src_oloc.key = oid.name; +} + /** do_op - do an op * pg lock will be held (if multithreaded) * osd_lock NOT held. @@ -392,7 +399,7 @@ void ReplicatedPG::do_op(MOSDOp *op) if ((op->get_rmw_flags() & CEPH_OSD_FLAG_PGOP)) return do_pg_op(op); - dout(10) << "do_op " << *op << dendl; + dout(10) << "do_op " << *op << (op->may_write() ? " may_write" : "") << dendl; if (finalizing_scrub && op->may_write()) { dout(20) << __func__ << ": waiting for scrub" << dendl; waiting_for_active.push_back(op); @@ -409,7 +416,6 @@ void ReplicatedPG::do_op(MOSDOp *op) op->get_snapid(), op->get_pg().ps()), op->get_object_locator(), &obc, can_create, &snapid); - if (r) { if (r == -EAGAIN) { // If we're not the primary of this OSD, and we have @@ -479,19 +485,21 @@ void ReplicatedPG::do_op(MOSDOp *op) map src_obc; for (vector::iterator p = op->ops.begin(); p != op->ops.end(); p++) { OSDOp& osd_op = *p; - hobject_t toid(osd_op.soid, op->get_object_locator().key, op->get_pg().ps()); + 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 (osd_op.soid.oid.name.length()) { if (!src_obc.count(toid)) { ObjectContext *sobc; snapid_t ssnapid; - int r = find_object_context(hobject_t(toid.oid, op->get_object_locator().key, + + int r = find_object_context(hobject_t(toid.oid, src_oloc.key, toid.snap, op->get_pg().ps()), - op->get_object_locator(), + 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, op->get_object_locator().key, - ssnapid, op->get_pg().ps()); + hobject_t wait_oid(osd_op.soid.oid, src_oloc.key, ssnapid, op->get_pg().ps()); wait_for_missing_object(wait_oid, op); } else if (r) { osd->reply_op_error(op, r); diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index f9295e4e13c13..3c847f4b7ae7e 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -510,6 +510,8 @@ protected: ObjectContext **pobc, bool can_create, snapid_t *psnapid=NULL); + void get_src_oloc(const object_t& oid, const object_locator_t& oloc, object_locator_t& src_oloc); + SnapSetContext *get_snapset_context(const object_t& oid, const string &key, ps_t seed, bool can_create); void register_snapset_context(SnapSetContext *ssc) {