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 snapshot(&self) -> HashMap<IpAddr, Arc<Stats>> {
60 self.0.read().clone()
61 }
62
63 pub fn register_sent_message(&self, to: IpAddr, size: usize) {
65 if let Some(stats) = self.0.read().get(&to) {
66 stats.register_sent_message(size);
67 }
68 }
69
70 pub fn register_received_message(&self, from: IpAddr, size: usize) {
72 if let Some(stats) = self.0.read().get(&from) {
73 stats.register_received_message(size);
74 }
75 }
76
77 pub fn register_failure(&self, addr: IpAddr) {
79 if let Some(stats) = self.0.read().get(&addr) {
80 stats.register_failure();
81 }
82 }
83}