]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson: retrieve object state once per MOSDOp.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Mon, 29 Apr 2019 12:48:27 +0000 (14:48 +0200)
committerKefu Chai <kchai@redhat.com>
Tue, 7 May 2019 10:04:53 +0000 (18:04 +0800)
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 <rzarzyns@redhat.com>
src/crimson/osd/pg.cc
src/crimson/osd/pg_backend.cc

index b977857ccd1ec3cee342ac0df4e50d9f5f47ea0d..d3e604f89a27856726ecc83284715ada763f17dd 100644 (file)
@@ -1005,20 +1005,16 @@ PG::do_osd_op(const ObjectState& os, OSDOp& osd_op, ceph::os::Transaction& txn)
 
 seastar::future<Ref<MOSDOpReply>> PG::do_osd_ops(Ref<MOSDOp> 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()
index 5cbddb374c545b03fc6ee1df492b3731f85cf434..10209cb6c0402e82221d4bd2febcd3899a20f2a6 100644 (file)
@@ -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<PGBackend::cached_os_t>(
+            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<PGBackend::cached_os_t>(
+              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<PGBackend::cached_os_t>(
+              object_not_found{});
           }
           logger().trace("find_object: {}@[{},{}] -- HIT",
                          soid, first, last);