]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson: PG caches ObjectState instead of object_info_t.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Fri, 26 Apr 2019 14:07:11 +0000 (16:07 +0200)
committerKefu Chai <kchai@redhat.com>
Tue, 7 May 2019 09:48:35 +0000 (17:48 +0800)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/osd/pg.cc
src/crimson/osd/pg.h
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h

index b7f41ccfd3aba996c7d422becdd61313064945cc..32f8cac525117c1b8fcd1f489f5f909494fbacfa 100644 (file)
@@ -969,13 +969,13 @@ seastar::future<> PG::wait_for_active()
 }
 
 seastar::future<>
-PG::do_osd_op(const object_info_t& oi, OSDOp& osd_op)
+PG::do_osd_op(const ObjectState& os, OSDOp& osd_op)
 {
   switch (const auto& op = osd_op.op; op.op) {
   case CEPH_OSD_OP_SYNC_READ:
     [[fallthrough]];
   case CEPH_OSD_OP_READ:
-    return backend->read(oi,
+    return backend->read(os.oi,
                          op.extent.offset,
                          op.extent.length,
                          op.extent.truncate_size,
@@ -1001,8 +1001,8 @@ seastar::future<Ref<MOSDOpReply>> PG::do_osd_ops(Ref<MOSDOp> m)
       const auto oid = (m->get_snapid() == CEPH_SNAPDIR ?
                         m->get_hobj().get_head() :
                         m->get_hobj());
-      return backend->get_object(oid).then([&osd_op,this](auto oi) {
-        return do_osd_op(*oi, osd_op);
+      return backend->get_object_state(oid).then([&osd_op,this](auto os) {
+        return do_osd_op(*os, osd_op);
       }).handle_exception_type([&osd_op](const object_not_found&) {
         osd_op.rval = -ENOENT;
         throw;
index b83d8a8158514aacc0fd2dd2211d574be81a24fe..2e2571e646aeab4b33f372ae7af14e9d892a3022 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "crimson/net/Fwd.h"
 #include "osd/osd_types.h"
+#include "osd/osd_internal_types.h"
 #include "recovery_state.h"
 
 template<typename T> using Ref = boost::intrusive_ptr<T>;
@@ -128,7 +129,7 @@ private:
                            const std::vector<int>& new_acting,
                            int new_acting_primary);
   seastar::future<Ref<MOSDOpReply>> do_osd_ops(Ref<MOSDOp> m);
-  seastar::future<> do_osd_op(const object_info_t& oi, OSDOp& op);
+  seastar::future<> do_osd_op(const ObjectState& os, OSDOp& op);
 
 private:
   const spg_t pgid;
index 813f84b4f3b5ba5613539dcdb55375086579ecdc..696fbd8cfc65fa205d91a608123fb2a67f592132 100644 (file)
@@ -44,19 +44,19 @@ PGBackend::PGBackend(shard_id_t shard,
     store{store}
 {}
 
-seastar::future<PGBackend::cached_oi_t>
-PGBackend::get_object(const hobject_t& oid)
+seastar::future<PGBackend::cached_os_t>
+PGBackend::get_object_state(const hobject_t& oid)
 {
   // want the head?
   if (oid.snap == CEPH_NOSNAP) {
     logger().trace("find_object: {}@HEAD", oid);
-    return _load_oi(oid);
+    return _load_os(oid);
   } else {
     // we want a snap
     return _load_ss(oid).then([oid,this](cached_ss_t ss) {
       // head?
       if (oid.snap > ss->seq) {
-        return _load_oi(oid.get_head());
+        return _load_os(oid.get_head());
       } else {
         // which clone would it be?
         auto clone = std::upper_bound(begin(ss->clones), end(ss->clones),
@@ -83,18 +83,18 @@ PGBackend::get_object(const hobject_t& oid)
           }
           logger().trace("find_object: {}@[{},{}] -- HIT",
                          soid, first, last);
-          return _load_oi(soid);
+          return _load_os(soid);
         });
       }
     });
   }
 }
 
-seastar::future<PGBackend::cached_oi_t>
-PGBackend::_load_oi(const hobject_t& oid)
+seastar::future<PGBackend::cached_os_t>
+PGBackend::_load_os(const hobject_t& oid)
 {
-  if (auto found = oi_cache.find(oid); found) {
-    return seastar::make_ready_future<cached_oi_t>(std::move(found));
+  if (auto found = os_cache.find(oid); found) {
+    return seastar::make_ready_future<cached_os_t>(std::move(found));
   }
   return store->get_attr(coll,
                          ghobject_t{oid, ghobject_t::NO_GEN, shard},
@@ -105,14 +105,17 @@ PGBackend::_load_oi(const hobject_t& oid)
       if (!ceph::os::CyanStore::EnoentException::is_class_of(ep)) {
         std::rethrow_exception(ep);
       }
+      return seastar::make_ready_future<cached_os_t>(
+        os_cache.insert(oid,
+          std::make_unique<ObjectState>(object_info_t{oid}, false)));
     } else {
       // decode existing OI_ATTR's value
       ceph::bufferlist bl;
       bl.push_back(std::move(fut).get0());
-      oi->decode(bl);
+      return seastar::make_ready_future<cached_os_t>(
+        os_cache.insert(oid,
+          std::make_unique<ObjectState>(object_info_t{bl}, true /* exists */)));
     }
-    return seastar::make_ready_future<cached_oi_t>(
-      oi_cache.insert(oid, std::move(oi)));
   });
 }
 
index 2774854f082197740bd18e8474585106836cd44d..6d92100fe90cb50cb3ceb88fcce760fbcd0e6d6f 100644 (file)
@@ -10,6 +10,7 @@
 
 #include "crimson/common/shared_lru.h"
 #include "osd/osd_types.h"
+#include "osd/osd_internal_types.h"
 
 struct hobject_t;
 namespace ceph::os {
@@ -30,8 +31,8 @@ public:
                                           const pg_pool_t& pool,
                                           ceph::os::CyanStore* store,
                                           const ec_profile_t& ec_profile);
-  using cached_oi_t = boost::local_shared_ptr<object_info_t>;
-  seastar::future<cached_oi_t> get_object(const hobject_t& oid);
+  using cached_os_t = boost::local_shared_ptr<ObjectState>;
+  seastar::future<cached_os_t> get_object_state(const hobject_t& oid);
   seastar::future<bufferlist> read(const object_info_t& oi,
                                   uint64_t off,
                                   uint64_t len,
@@ -47,8 +48,8 @@ private:
   using cached_ss_t = boost::local_shared_ptr<SnapSet>;
   SharedLRU<hobject_t, SnapSet> ss_cache;
   seastar::future<cached_ss_t> _load_ss(const hobject_t& oid);
-  SharedLRU<hobject_t, object_info_t> oi_cache;
-  seastar::future<cached_oi_t> _load_oi(const hobject_t& oid);
+  SharedLRU<hobject_t, ObjectState> os_cache;
+  seastar::future<cached_os_t> _load_os(const hobject_t& oid);
   virtual seastar::future<bufferlist> _read(const hobject_t& hoid,
                                            size_t offset,
                                            size_t length,