snarkos_node_tcp/helpers/
known_peers.rs1use std::{
17 collections::{HashMap, hash_map::Entry},
18 net::IpAddr,
19 sync::Arc,
20 time::Instant,
21};
22
23#[cfg(feature = "locktick")]
24use locktick::parking_lot::RwLock;
25#[cfg(not(feature = "locktick"))]
26use parking_lot::RwLock;
27
28use crate::Stats;
29
30#[derive(Default)]
32pub struct KnownPeers(RwLock<HashMap<IpAddr, Arc<Stats>>>);
33
34impl KnownPeers {
35 pub fn add(&self, addr: IpAddr) {
37 let timestamp = Instant::now();
38 match self.0.write().entry(addr) {
39 Entry::Vacant(entry) => {
40 entry.insert(Arc::new(Stats::new(timestamp)));
41 }
42 Entry::Occupied(entry) => {
43 *entry.get().timestamp.write() = timestamp;
44 }
45 }
46 }
47
48 pub fn get(&self, addr: IpAddr) -> Option<Arc<Stats>> {
50 self.0.read().get(&addr).map(Arc::clone)
51 }
52
53 pub fn remove(&self, addr: IpAddr) -> Option<Arc<Stats>> {
55 self.0.write().remove(&addr)
56 }
57
58 pub fn batch_remove<I: Iterator<Item = IpAddr>>(&self, addrs: I) {
60 let mut peers = self.0.write();
61 for addr in addrs {
62 peers.remove(&addr);
63 }
64 }
65
66 pub fn snapshot(&self) -> HashMap<IpAddr, Arc<Stats>> {
68 self.0.read().clone()
69 }
70
71 pub fn register_sent_message(&self, to: IpAddr, size: usize) {
73 if let Some(stats) = self.0.read().get(&to) {
74 stats.register_sent_message(size);
75 }
76 }
77
78 pub fn register_received_message(&self, from: IpAddr, size: usize) {
80 if let Some(stats) = self.0.read().get(&from) {
81 stats.register_received_message(size);
82 }
83 }
84
85 pub fn register_failure(&self, addr: IpAddr) {
87 if let Some(stats) = self.0.read().get(&addr) {
88 stats.register_failure();
89 }
90 }
91}