use super::{AtomicU64, GrantLog, MembershipRefusal, Ordering, Resource, Subject};
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum AuthorityState {
NotReady,
Ready {
log: GrantLog,
revision: u64,
generation: u64,
},
Unavailable {
cause: String,
},
Gap {
after: u64,
missing: u64,
},
Reset,
}
pub trait MembershipAuthority: Send + Sync + std::fmt::Debug {
fn state(&self) -> AuthorityState;
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct MembershipChange {
pub log: GrantLog,
pub revision: u64,
pub subject: Option<Subject>,
pub resource: Resource,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct AppliedChange {
pub duplicate: bool,
pub affected: u64,
pub redecided: u64,
pub failed: u64,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct ResumeReport {
pub rechecked: u64,
pub failed: u64,
pub settled: bool,
}
pub trait MembershipListener: Send + Sync {
fn changed(&self, change: &MembershipChange) -> Result<AppliedChange, MembershipRefusal>;
fn resumed(&self, generation: u64, revision: u64) -> Result<ResumeReport, MembershipRefusal>;
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Decided {
NotProtected,
Allowed {
grant: String,
revision: u64,
},
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct MembershipCounts {
pub decisions_asked: u64,
pub admissions_asked: u64,
pub pages_asked: u64,
pub page_rows: u64,
pub local_lookups: u64,
pub release_checks: u64,
pub refused: u64,
pub affected_visited: u64,
pub resume_rechecks: u64,
pub released: u64,
pub locks: u64,
}
#[derive(Debug, Default)]
pub(super) struct Counters {
pub(super) decisions_asked: AtomicU64,
pub(super) admissions_asked: AtomicU64,
pub(super) pages_asked: AtomicU64,
pub(super) page_rows: AtomicU64,
pub(super) local_lookups: AtomicU64,
pub(super) release_checks: AtomicU64,
pub(super) refused: AtomicU64,
pub(super) affected_visited: AtomicU64,
pub(super) resume_rechecks: AtomicU64,
pub(super) released: AtomicU64,
pub(super) locks: AtomicU64,
}
impl Counters {
pub(super) fn snapshot(&self) -> MembershipCounts {
let read = |counter: &AtomicU64| counter.load(Ordering::Relaxed);
MembershipCounts {
decisions_asked: read(&self.decisions_asked),
admissions_asked: read(&self.admissions_asked),
pages_asked: read(&self.pages_asked),
page_rows: read(&self.page_rows),
local_lookups: read(&self.local_lookups),
release_checks: read(&self.release_checks),
refused: read(&self.refused),
affected_visited: read(&self.affected_visited),
resume_rechecks: read(&self.resume_rechecks),
released: read(&self.released),
locks: read(&self.locks),
}
}
}