bool is_acquired() const;
+ /// pass the provided exception to any waiting waiters
+ template<typename Exception>
+ void abort(Exception ex) {
+ while (!waiters.empty()) {
+ auto& waiter = waiters.front();
+ waiter.pr.set_exception(std::make_exception_ptr(ex));
+ waiters.pop_front();
+ }
+ }
+
private:
void wake();
unsigned readers = 0;
#include "common/intrusive_lru.h"
#include "osd/object_state.h"
+#include "crimson/common/exception.h"
#include "crimson/common/tri_mutex.h"
#include "crimson/osd/osd_operation.h"
loaded = true;
}
+ /// pass the provided exception to any waiting consumers of this ObjectContext
+ template<typename Exception>
+ void interrupt(Exception ex) {
+ rwlock.abort(std::move(ex));
+ if (recovery_read_marker) {
+ drop_recovery_read();
+ }
+ }
+
private:
tri_mutex rwlock;
bool recovery_read_marker = false;
if ((recovery_waiter.pi && recovery_waiter.pi->is_complete())
|| (!recovery_waiter.pi
&& recovery_waiter.obc && recovery_waiter.obc->obs.exists)) {
- recovery_waiter.obc->drop_recovery_read();
+ recovery_waiter.obc->interrupt(
+ ::crimson::common::actingset_changed(
+ pg.is_primary()));
recovery_waiter.interrupt(why);
}
}