{
private:
tri_mutex lock;
- bool recovery_read_marker = false;
public:
ObjectState obs;
template<typename Exception>
void interrupt(Exception ex) {
lock.abort(std::move(ex));
- if (recovery_read_marker) {
- drop_recovery_read();
- }
}
bool is_loaded() const {
bool is_request_pending() const {
return lock.is_acquired();
}
-
- bool get_recovery_read() {
- if (lock.try_lock_for_read()) {
- recovery_read_marker = true;
- return true;
- } else {
- return false;
- }
- }
- void wait_recovery_read() {
- assert(lock.get_readers() > 0);
- recovery_read_marker = true;
- }
- void drop_recovery_read() {
- assert(recovery_read_marker);
- recovery_read_marker = false;
- }
};
using ObjectContextRef = ObjectContext::Ref;
pg->get_peering_state().object_recovered(soid, stat_diff);
pg->publish_stats_to_osd();
auto& recovery_waiter = pg->get_recovery_backend()->get_recovering(soid);
- if (!is_delete)
- recovery_waiter.obc->drop_recovery_read();
recovery_waiter.set_recovered();
pg->get_recovery_backend()->remove_recovering(soid);
}
logger().debug("recover_object: loaded obc: {}", obc->obs.oi.soid);
auto& recovery_waiter = get_recovering(soid);
recovery_waiter.obc = obc;
- recovery_waiter.obc->wait_recovery_read();
return maybe_push_shards(head, soid, need);
}, false).handle_error_interruptible(
crimson::osd::PG::load_obc_ertr::all_same_way([soid](auto& code) {
}
return seastar::make_ready_future<>();
}).handle_exception_interruptible([this, soid](auto e) {
- auto &recovery = get_recovering(soid);
- if (recovery.obc) {
- recovery.obc->drop_recovery_read();
- }
recovering.erase(soid);
return seastar::make_exception_future<>(e);
});