From 1dfa5b8b88714279dada605134a017f467a76449 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Fri, 26 Apr 2019 16:07:11 +0200 Subject: [PATCH] crimson: PG caches ObjectState instead of object_info_t. Signed-off-by: Radoslaw Zarzynski --- src/crimson/osd/pg.cc | 8 ++++---- src/crimson/osd/pg.h | 3 ++- src/crimson/osd/pg_backend.cc | 27 +++++++++++++++------------ src/crimson/osd/pg_backend.h | 9 +++++---- 4 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index b7f41ccfd3a..32f8cac5251 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -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> PG::do_osd_ops(Ref 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; diff --git a/src/crimson/osd/pg.h b/src/crimson/osd/pg.h index b83d8a81585..2e2571e646a 100644 --- a/src/crimson/osd/pg.h +++ b/src/crimson/osd/pg.h @@ -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 using Ref = boost::intrusive_ptr; @@ -128,7 +129,7 @@ private: const std::vector& new_acting, int new_acting_primary); seastar::future> do_osd_ops(Ref 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; diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 813f84b4f3b..696fbd8cfc6 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -44,19 +44,19 @@ PGBackend::PGBackend(shard_id_t shard, store{store} {} -seastar::future -PGBackend::get_object(const hobject_t& oid) +seastar::future +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::_load_oi(const hobject_t& oid) +seastar::future +PGBackend::_load_os(const hobject_t& oid) { - if (auto found = oi_cache.find(oid); found) { - return seastar::make_ready_future(std::move(found)); + if (auto found = os_cache.find(oid); found) { + return seastar::make_ready_future(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( + os_cache.insert(oid, + std::make_unique(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( + os_cache.insert(oid, + std::make_unique(object_info_t{bl}, true /* exists */))); } - return seastar::make_ready_future( - oi_cache.insert(oid, std::move(oi))); }); } diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index 2774854f082..6d92100fe90 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -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; - seastar::future get_object(const hobject_t& oid); + using cached_os_t = boost::local_shared_ptr; + seastar::future get_object_state(const hobject_t& oid); seastar::future 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; SharedLRU ss_cache; seastar::future _load_ss(const hobject_t& oid); - SharedLRU oi_cache; - seastar::future _load_oi(const hobject_t& oid); + SharedLRU os_cache; + seastar::future _load_os(const hobject_t& oid); virtual seastar::future _read(const hobject_t& hoid, size_t offset, size_t length, -- 2.39.5