aboutsummaryrefslogtreecommitdiffstats
path: root/src/access/screen.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/access/screen.rs')
-rw-r--r--src/access/screen.rs27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/access/screen.rs b/src/access/screen.rs
index e15b407..89ca007 100644
--- a/src/access/screen.rs
+++ b/src/access/screen.rs
@@ -70,6 +70,9 @@ pub(crate) struct Screening {
refusals: Refusals,
/// The members refused as a whole, by node ID (`refusing`).
refusing: std::collections::BTreeMap<String, Refusing>,
+ /// Changes this node holds that peers say the swarm's rules refuse, and its own do
+ /// too, whose drop would take much: each with the peers that said so (`hold_drop`).
+ held_drops: HashMap<ChangeHash, BTreeSet<String>>,
}
/// A member refused as a whole: since when, for which change of its, and why.
@@ -139,6 +142,30 @@ impl Screening {
}
}
+ /// `peer` says `root`, held here, is refused by the swarm's rules, its drop taking
+ /// much (`AppState::drop_taken`): how many peers said so of it, this one with them.
+ pub(crate) fn hold_drop(&mut self, root: ChangeHash, peer: &str) -> usize {
+ let named = self.held_drops.entry(root).or_default();
+ named.insert(peer.to_owned());
+ named.len()
+ }
+
+ /// Drops held, for another peer to say so too (`hold_drop`).
+ pub(crate) fn drops_held(&self) -> usize {
+ self.held_drops.len()
+ }
+
+ /// `dropped`, changes this node took unjudged and dropped (`AppState::drop_taken`),
+ /// kept with those refused, the oldest going past `MAX_REFUSED`; logged once, there.
+ pub(crate) fn keep_dropped(&mut self, dropped: Vec<Refused>) {
+ for dropped in dropped {
+ self.refused.push_back(dropped);
+ if self.refused.len() > MAX_REFUSED {
+ self.refused.pop_front();
+ }
+ }
+ }
+
/// Those refused, oldest first.
pub(crate) fn refused(&self) -> impl DoubleEndedIterator<Item = &Refused> {
self.refused.iter()