Skip to content

Commit

Permalink
Merge pull request ceph#27310 from tchaikov/wip-crimson-cache-ss-oi
Browse files Browse the repository at this point in the history
crimson/osd: cache object_info and snapset in PGBackend

Reviewed-by: Samuel Just <[email protected]>
Reviewed-by: Radoslaw Zarzynski <[email protected]>
  • Loading branch information
tchaikov authored Apr 3, 2019
2 parents f746609 + 60e36f1 commit 957f004
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 21 deletions.
2 changes: 1 addition & 1 deletion src/crimson/osd/pg.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1003,7 +1003,7 @@ seastar::future<Ref<MOSDOpReply>> PG::do_osd_ops(Ref<MOSDOp> 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;
Expand Down
45 changes: 28 additions & 17 deletions src/crimson/osd/pg_backend.cc
Original file line number Diff line number Diff line change
Expand Up @@ -44,31 +44,32 @@ PGBackend::PGBackend(shard_id_t shard,
store{store}
{}

seastar::future<object_info_t> PGBackend::get_object(const hobject_t& oid)
seastar::future<PGBackend::cached_oi_t>
PGBackend::get_object(const hobject_t& oid)
{
// want the head?
if (oid.snap == CEPH_NOSNAP) {
logger().trace("find_object: {}@HEAD", 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{};
Expand All @@ -89,28 +90,38 @@ seastar::future<object_info_t> PGBackend::get_object(const hobject_t& oid)
}
}

seastar::future<object_info_t> PGBackend::_load_oi(const hobject_t& oid)
seastar::future<PGBackend::cached_oi_t>
PGBackend::_load_oi(const hobject_t& oid)
{
if (auto found = oi_cache.find(oid); found) {
return seastar::make_ready_future<cached_oi_t>(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<object_info_t>();
bufferlist bl;
bl.push_back(std::move(bp));
oi.decode(bl);
return seastar::make_ready_future<object_info_t>(std::move(oi));
oi->decode(bl);
return seastar::make_ready_future<cached_oi_t>(
oi_cache.insert(oid, std::move(oi)));
});
}

seastar::future<SnapSet> PGBackend::_load_ss(const hobject_t& oid)
seastar::future<PGBackend::cached_ss_t>
PGBackend::_load_ss(const hobject_t& oid)
{
if (auto found = ss_cache.find(oid); found) {
return seastar::make_ready_future<cached_ss_t>(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<SnapSet>(std::move(snapset));
auto snapset = std::make_unique<SnapSet>(bl);
return seastar::make_ready_future<cached_ss_t>(
ss_cache.insert(oid, std::move(snapset)));
});
}

Expand Down
12 changes: 9 additions & 3 deletions src/crimson/osd/pg_backend.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
#include <map>
#include <memory>
#include <string>
#include <boost/smart_ptr/local_shared_ptr.hpp>

#include "crimson/common/shared_lru.h"
#include "osd/osd_types.h"

struct hobject_t;
Expand All @@ -28,7 +30,8 @@ class PGBackend
const pg_pool_t& pool,
ceph::os::CyanStore* store,
const ec_profile_t& ec_profile);
seastar::future<object_info_t> get_object(const hobject_t& oid);
using cached_oi_t = boost::local_shared_ptr<object_info_t>;
seastar::future<cached_oi_t> get_object(const hobject_t& oid);
seastar::future<bufferlist> read(const object_info_t& oi,
uint64_t off,
uint64_t len,
Expand All @@ -41,8 +44,11 @@ class PGBackend
ceph::os::CyanStore* store;

private:
seastar::future<SnapSet> _load_ss(const hobject_t& oid);
seastar::future<object_info_t> _load_oi(const hobject_t& oid);
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);
virtual seastar::future<bufferlist> _read(const hobject_t& hoid,
size_t offset,
size_t length,
Expand Down

0 comments on commit 957f004

Please sign in to comment.