#include "common/Formatter.h"
#include "crimson/common/config_proxy.h"
+namespace {
+ seastar::logger& logger() {
+ return crimson::get_logger(ceph_subsys_osd);
+ }
+}
+
namespace crimson::osd {
ObjectContextRegistry::ObjectContextRegistry(crimson::common::ConfigProxy &conf)
obc_lru.set_target_size(conf.get_val<uint64_t>("crimson_osd_obc_lru_size"));
}
+std::optional<hobject_t> resolve_oid(
+ const SnapSet &ss,
+ const hobject_t &oid)
+{
+ logger().debug("{} oid.snap={},head snapset.seq={}",
+ __func__, oid.snap, ss.seq);
+ if (oid.snap > ss.seq) {
+ // Because oid.snap > ss.seq, we are trying to read from a snapshot
+ // taken after the most recent write to this object. Read from head.
+ return oid.get_head();
+ } else {
+ // which clone would it be?
+ auto clone = std::lower_bound(
+ begin(ss.clones), end(ss.clones),
+ oid.snap);
+ if (clone == end(ss.clones)) {
+ // Doesn't exist, > last clone, < ss.seq
+ return std::nullopt;
+ }
+ auto citer = ss.clone_snaps.find(*clone);
+ // TODO: how do we want to handle this kind of logic error?
+ ceph_assert(citer != ss.clone_snaps.end());
+
+ if (std::find(
+ citer->second.begin(),
+ citer->second.end(),
+ oid.snap) == citer->second.end()) {
+ logger().debug("{} {} does not contain {} -- DNE",
+ __func__, ss.clone_snaps, oid.snap);
+ return std::nullopt;
+ } else {
+ auto soid = oid;
+ soid.snap = *clone;
+ return std::optional<hobject_t>(soid);
+ }
+ }
+}
}
const std::set <std::string> &changed) final;
};
+std::optional<hobject_t> resolve_oid(const SnapSet &ss,
+ const hobject_t &oid);
+
} // namespace crimson::osd
}
}
-std::optional<hobject_t> PG::resolve_oid(
- const SnapSet &ss,
- const hobject_t &oid)
-{
- logger().debug("{} oid.snap={},head snapset.seq={}",
- __func__, oid.snap, ss.seq);
- if (oid.snap > ss.seq) {
- // Because oid.snap > ss.seq, we are trying to read from a snapshot
- // taken after the most recent write to this object. Read from head.
- return oid.get_head();
- } else {
- // which clone would it be?
- auto clone = std::lower_bound(
- begin(ss.clones), end(ss.clones),
- oid.snap);
- if (clone == end(ss.clones)) {
- // Doesn't exist, > last clone, < ss.seq
- return std::nullopt;
- }
- auto citer = ss.clone_snaps.find(*clone);
- // TODO: how do we want to handle this kind of logic error?
- ceph_assert(citer != ss.clone_snaps.end());
-
- if (std::find(
- citer->second.begin(),
- citer->second.end(),
- oid.snap) == citer->second.end()) {
- logger().debug("{} {} does not contain {} -- DNE",
- __func__, ss.clone_snaps, oid.snap);
- return std::nullopt;
- } else {
- auto soid = oid;
- soid.snap = *clone;
- return std::optional<hobject_t>(soid);
- }
- }
-}
-
PG::load_obc_iertr::future<>
PG::with_locked_obc(const hobject_t &hobj,
const OpInfo &op_info,
static hobject_t get_oid(const hobject_t& hobj);
static RWState::State get_lock_type(const OpInfo &op_info);
- static std::optional<hobject_t> resolve_oid(
- const SnapSet &snapset,
- const hobject_t &oid);
using load_obc_ertr = crimson::errorator<
crimson::ct_error::enoent,