});
}
- template<RWState::State State>
- ObjectContextLoader::load_obc_iertr::future<>
- ObjectContextLoader::with_clone_obc_direct(
- hobject_t oid,
- with_obc_func_t&& func)
- {
- LOG_PREFIX(ObjectContextLoader::with_clone_obc_direct);
- assert(!oid.is_head());
- return with_obc<RWState::RWREAD>(
- oid.get_head(),
- [FNAME, oid, func=std::move(func), this](auto head, auto) mutable
- -> load_obc_iertr::future<> {
- if (!head->obs.exists) {
- ERRORDPP("head doesn't exist for object {}", dpp, head->obs.oi.soid);
- return load_obc_iertr::future<>{
- crimson::ct_error::enoent::make()
- };
- }
-#ifndef NDEBUG
- auto &ss = head->get_head_ss();
- auto cit = std::find(
- std::begin(ss.clones), std::end(ss.clones), oid.snap);
- assert(cit != std::end(ss.clones));
-#endif
- auto [clone, existed] = obc_registry.get_cached_obc(oid);
- return clone->template with_lock<State, IOInterruptCondition>(
- [existed=existed, clone=std::move(clone),
- func=std::move(func), head=std::move(head), this]()
- -> load_obc_iertr::future<> {
- auto loaded = get_or_load_obc<State>(clone, existed);
- return loaded.safe_then_interruptible(
- [func = std::move(func), head=std::move(head)](auto clone) {
- clone->set_clone_ssc(head->ssc);
- return std::move(func)(std::move(head), std::move(clone));
- });
- });
- });
- }
-
template<RWState::State State>
ObjectContextLoader::load_obc_iertr::future<>
ObjectContextLoader::with_obc(hobject_t oid,
template ObjectContextLoader::load_obc_iertr::future<>
ObjectContextLoader::with_obc<RWState::RWEXCL>(hobject_t,
with_obc_func_t&&);
-
- template ObjectContextLoader::load_obc_iertr::future<>
- ObjectContextLoader::with_clone_obc_direct<RWState::RWWRITE>(
- hobject_t,
- with_obc_func_t&&);
}
std::function<load_obc_iertr::future<> (ObjectContextRef, ObjectContextRef)>;
// Use this variant by default
+ // If oid is a clone object, the clone obc *and* it's
+ // matching head obc will be locked and can be used in func.
template<RWState::State State>
load_obc_iertr::future<> with_obc(hobject_t oid,
with_obc_func_t&& func);
hobject_t clone_oid,
with_obc_func_t&& func);
- // Use this variant in the case where both the head
- // object *and* the matching clone object are being used
- // in func.
- template<RWState::State State>
- load_obc_iertr::future<> with_clone_obc_direct(
- hobject_t oid,
- with_obc_func_t&& func);
-
load_obc_iertr::future<> reload_obc(ObjectContext& obc) const;
void notify_on_change(bool is_primary);
}).then_interruptible([this] {
logger().debug("{}: getting obc for {}", *this, coid);
// end of commonality
- // with_clone_obc_direct lock both clone's and head's obcs
- return pg->obc_loader.with_clone_obc_direct<RWState::RWWRITE>(
+ // lock both clone's and head's obcs
+ return pg->obc_loader.with_obc<RWState::RWWRITE>(
coid,
[this](auto head_obc, auto clone_obc) {
logger().debug("{}: got clone_obc={}", *this, clone_obc->get_oid());