diff --git a/src/display/ui_state.rs b/src/display/ui_state.rs index 179cba2..55d0f09 100644 --- a/src/display/ui_state.rs +++ b/src/display/ui_state.rs @@ -89,7 +89,7 @@ pub struct UIState { pub remote_addresses_map: HashMap, pub connections_map: HashMap, /// Used for reducing logging noise. - known_orphan_sockets: RefCell>, + known_orphan_sockets: RefCell>, } impl UIState { @@ -126,21 +126,29 @@ impl UIState { }) }); - // only log each orphan connection once - if name.is_none() && self.known_orphan_sockets.borrow_mut().insert(*local_socket) { - match connections_to_procs - .iter() - .find(|(&LocalSocket { port, protocol, .. }, _)| { - port == local_socket.port && protocol == local_socket.protocol - }) { - Some((lookalike, name)) => { - warn!( - r#""{name}" owns a similar looking connection, but its local ip doesn't match."# - ); - warn!("Looking for: {local_socket}; found: {lookalike}"); - } - None => warn!("Cannot determine which process owns {local_socket}."), - }; + if name.is_none() { + let mut orphans = self.known_orphan_sockets.borrow_mut(); + // only log each orphan connection once + if !orphans.contains(local_socket) { + // newer connections go in the front so that searches are faster + // basically recency bias + orphans.push_front(*local_socket); + orphans.truncate(10_000); // arbitrary maximum backlog + + match connections_to_procs.iter().find( + |(&LocalSocket { port, protocol, .. }, _)| { + port == local_socket.port && protocol == local_socket.protocol + }, + ) { + Some((lookalike, name)) => { + warn!( + r#""{name}" owns a similar looking connection, but its local ip doesn't match."# + ); + warn!("Looking for: {local_socket}; found: {lookalike}"); + } + None => warn!("Cannot determine which process owns {local_socket}."), + }; + } } name