From: Radoslaw Zarzynski Date: Mon, 29 Apr 2019 12:48:27 +0000 (+0200) Subject: crimson: retrieve object state once per MOSDOp. X-Git-Tag: v15.1.0~2730^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d86ffe51aae3d7494ad6d6f0a5fa24318d90bc21;p=ceph.git crimson: retrieve object state once per MOSDOp. Justification behind the change is behaviour of classical OSD. It calls PrimaryLogPG::find_object_context() far before going through OSDOps in ::do_osd_ops(). Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index b977857ccd1..d3e604f89a2 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -1005,20 +1005,16 @@ PG::do_osd_op(const ObjectState& os, OSDOp& osd_op, ceph::os::Transaction& txn) seastar::future> PG::do_osd_ops(Ref m) { - // todo: issue requests in parallel if they don't write, - // with writes being basically a synchronization barrier return seastar::do_with(std::move(m), ceph::os::Transaction{}, [this](auto& m, auto& txn) { - return seastar::do_for_each(begin(m->ops), end(m->ops), - [m,&txn,this](OSDOp& osd_op) { - const auto oid = (m->get_snapid() == CEPH_SNAPDIR ? - m->get_hobj().get_head() : - m->get_hobj()); - return backend->get_object_state(oid).then([&osd_op,&txn,this](auto os) { + const auto oid = m->get_snapid() == CEPH_SNAPDIR ? m->get_hobj().get_head() + : m->get_hobj(); + return backend->get_object_state(oid).then([m,&txn,this](auto os) { + // TODO: issue requests in parallel if they don't write, + // with writes being basically a synchronization barrier + return seastar::do_for_each(std::begin(m->ops), std::end(m->ops), + [m,&txn,this,os=std::move(os)](OSDOp& osd_op) { return do_osd_op(*os, osd_op, txn); - }).handle_exception_type([&osd_op](const object_not_found&) { - osd_op.rval = -ENOENT; - throw; }); }).then([&] { return txn.empty() ? seastar::now() diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 5cbddb374c5..10209cb6c04 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -62,7 +62,8 @@ PGBackend::get_object_state(const hobject_t& oid) auto clone = std::upper_bound(begin(ss->clones), end(ss->clones), oid.snap); if (clone == end(ss->clones)) { - throw object_not_found{}; + return seastar::make_exception_future( + object_not_found{}); } // clone auto soid = oid; @@ -72,14 +73,16 @@ PGBackend::get_object_state(const hobject_t& oid) assert(clone_snap != end(ss->clone_snaps)); if (clone_snap->second.empty()) { logger().trace("find_object: {}@[] -- DNE", soid); - throw object_not_found{}; + return seastar::make_exception_future( + object_not_found{}); } auto first = clone_snap->second.back(); auto last = clone_snap->second.front(); if (first > soid.snap) { logger().trace("find_object: {}@[{},{}] -- DNE", soid, first, last); - throw object_not_found{}; + return seastar::make_exception_future( + object_not_found{}); } logger().trace("find_object: {}@[{},{}] -- HIT", soid, first, last);