From: Kefu Chai Date: Tue, 2 Apr 2019 08:55:50 +0000 (+0800) Subject: crimson/osd: cache object_info and snapset in PGBackend X-Git-Tag: v15.0.0~11^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F27310%2Fhead;p=ceph.git crimson/osd: cache object_info and snapset in PGBackend for better performance Signed-off-by: Kefu Chai --- diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index e7198545bf41..e16a07c1b42c 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -1003,7 +1003,7 @@ seastar::future> PG::do_osd_ops(Ref m) 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 do_osd_op(*oi, &osd_op); }).handle_exception_type([&osd_op](const object_not_found&) { osd_op.rval = -ENOENT; throw; diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 8ceaddc9dae1..ec1aa3495bf7 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -44,7 +44,8 @@ PGBackend::PGBackend(shard_id_t shard, store{store} {} -seastar::future PGBackend::get_object(const hobject_t& oid) +seastar::future +PGBackend::get_object(const hobject_t& oid) { // want the head? if (oid.snap == CEPH_NOSNAP) { @@ -52,23 +53,23 @@ seastar::future PGBackend::get_object(const hobject_t& oid) return _load_oi(oid); } else { // we want a snap - return _load_ss(oid).then([oid,this](SnapSet ss) { + return _load_ss(oid).then([oid,this](cached_ss_t ss) { // head? - if (oid.snap > ss.seq) { + if (oid.snap > ss->seq) { return _load_oi(oid.get_head()); } else { // which clone would it be? - auto clone = std::upper_bound(begin(ss.clones), end(ss.clones), + auto clone = std::upper_bound(begin(ss->clones), end(ss->clones), oid.snap); - if (clone == end(ss.clones)) { + if (clone == end(ss->clones)) { throw object_not_found{}; } // clone auto soid = oid; soid.snap = *clone; - return _load_ss(soid).then([soid,this](SnapSet ss) { - auto clone_snap = ss.clone_snaps.find(soid.snap); - assert(clone_snap != end(ss.clone_snaps)); + return _load_ss(soid).then([soid,this](cached_ss_t ss) { + auto clone_snap = ss->clone_snaps.find(soid.snap); + assert(clone_snap != end(ss->clone_snaps)); if (clone_snap->second.empty()) { logger().trace("find_object: {}@[] -- DNE", soid); throw object_not_found{}; @@ -89,28 +90,38 @@ seastar::future PGBackend::get_object(const hobject_t& oid) } } -seastar::future PGBackend::_load_oi(const hobject_t& oid) +seastar::future +PGBackend::_load_oi(const hobject_t& oid) { + if (auto found = oi_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}, - OI_ATTR).then([this](auto bp) { - object_info_t oi; + OI_ATTR).then([oid, this](auto bp) { + auto oi = std::make_unique(); bufferlist bl; bl.push_back(std::move(bp)); - oi.decode(bl); - return seastar::make_ready_future(std::move(oi)); + oi->decode(bl); + return seastar::make_ready_future( + oi_cache.insert(oid, std::move(oi))); }); } -seastar::future PGBackend::_load_ss(const hobject_t& oid) +seastar::future +PGBackend::_load_ss(const hobject_t& oid) { + if (auto found = ss_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}, - SS_ATTR).then([this](auto bp) { + SS_ATTR).then([oid, this](auto bp) { bufferlist bl; bl.push_back(std::move(bp)); - SnapSet snapset{bl}; - return seastar::make_ready_future(std::move(snapset)); + auto snapset = std::make_unique(bl); + return seastar::make_ready_future( + ss_cache.insert(oid, std::move(snapset))); }); } diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index 0ac8ff38ed9c..2774854f0821 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -6,7 +6,9 @@ #include #include #include +#include +#include "crimson/common/shared_lru.h" #include "osd/osd_types.h" struct hobject_t; @@ -28,7 +30,8 @@ public: const pg_pool_t& pool, ceph::os::CyanStore* store, const ec_profile_t& ec_profile); - seastar::future get_object(const hobject_t& oid); + using cached_oi_t = boost::local_shared_ptr; + seastar::future get_object(const hobject_t& oid); seastar::future read(const object_info_t& oi, uint64_t off, uint64_t len, @@ -41,8 +44,11 @@ protected: ceph::os::CyanStore* store; private: - seastar::future _load_ss(const hobject_t& oid); - seastar::future _load_oi(const hobject_t& oid); + 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); virtual seastar::future _read(const hobject_t& hoid, size_t offset, size_t length,