|
@@ -47,6 +47,9 @@ pub struct Hosts {
|
|
|
/// Internet interrupt (goblins unplugging cables)
|
|
/// Internet interrupt (goblins unplugging cables)
|
|
|
quarantine: RwLock<HashMap<Url, usize>>,
|
|
quarantine: RwLock<HashMap<Url, usize>>,
|
|
|
|
|
|
|
|
|
|
+ /// Peers we reject from connecting
|
|
|
|
|
+ rejected: RwLock<HashSet<Url>>,
|
|
|
|
|
+
|
|
|
/// Subscriber listening for store updates
|
|
/// Subscriber listening for store updates
|
|
|
store_subscriber: SubscriberPtr<usize>,
|
|
store_subscriber: SubscriberPtr<usize>,
|
|
|
|
|
|
|
@@ -60,6 +63,7 @@ impl Hosts {
|
|
|
Arc::new(Self {
|
|
Arc::new(Self {
|
|
|
addrs: RwLock::new(HashSet::new()),
|
|
addrs: RwLock::new(HashSet::new()),
|
|
|
quarantine: RwLock::new(HashMap::new()),
|
|
quarantine: RwLock::new(HashMap::new()),
|
|
|
|
|
+ rejected: RwLock::new(HashSet::new()),
|
|
|
store_subscriber: Subscriber::new(),
|
|
store_subscriber: Subscriber::new(),
|
|
|
settings,
|
|
settings,
|
|
|
})
|
|
})
|
|
@@ -210,6 +214,21 @@ impl Hosts {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /// Check if a given peer should be rejected
|
|
|
|
|
+ pub async fn is_rejected(&self, peer: &Url) -> bool {
|
|
|
|
|
+ self.rejected.read().await.contains(peer)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /// Mark a peer as rejected
|
|
|
|
|
+ pub async fn mark_rejected(&self, peer: &Url) {
|
|
|
|
|
+ self.rejected.write().await.insert(peer.clone());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /// Unmark a rejected peer
|
|
|
|
|
+ pub async fn unmark_rejected(&self, peer: &Url) {
|
|
|
|
|
+ self.rejected.write().await.remove(peer);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/// Check if the host list is empty.
|
|
/// Check if the host list is empty.
|
|
|
pub async fn is_empty(&self) -> bool {
|
|
pub async fn is_empty(&self) -> bool {
|
|
|
self.addrs.read().await.is_empty()
|
|
self.addrs.read().await.is_empty()
|