}
}
- bool is_fully_loaded() const {
- return fully_loaded;
+ bool is_loaded_and_valid() const {
+ return fully_loaded && !invalidated_by_interval_change;
}
private:
boost::intrusive::list_member_hook<> obc_accessing_hook;
uint64_t list_link_cnt = 0;
bool fully_loaded = false;
+ bool invalidated_by_interval_change = false;
+ friend class ObjectContextRegistry;
+ friend class ObjectContextLoader;
public:
template <typename ListType>
obc_lru.clear_range(from, to);
}
+ void invalidate_on_interval_change() {
+ obc_lru.clear([](auto &obc) {
+ obc.invalidated_by_interval_change = true;
+ });
+ }
+
template <class F>
void for_each(F&& f) {
obc_lru.for_each(std::forward<F>(f));
auto loaded =
load_obc_iertr::make_ready_future<ObjectContextRef>(obc);
if (existed) {
- ceph_assert(obc->is_fully_loaded());
+ if (!obc->is_loaded_and_valid()) {
+ ERRORDPP(
+ "obc for {} invalid -- fully_loaded={}, "
+ "invalidated_by_interval_change={}",
+ dpp, obc->get_oid(),
+ obc->fully_loaded, obc->invalidated_by_interval_change
+ );
+ }
+ ceph_assert(obc->is_loaded_and_valid());
DEBUGDPP("cache hit on {}", dpp, obc->get_oid());
} else {
DEBUGDPP("cache miss on {}", dpp, obc->get_oid());
client_request_orderer.clear_and_cancel(*this);
}
scrubber.on_interval_change();
+ obc_registry.invalidate_on_interval_change();
}
void PG::context_registry_on_change() {