}
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,
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;
#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>;
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;
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),
}
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},
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)));
});
}
#include "crimson/common/shared_lru.h"
#include "osd/osd_types.h"
+#include "osd/osd_internal_types.h"
struct hobject_t;
namespace ceph::os {
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,
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,