diff --git a/crates/ptth_relay/src/lib.rs b/crates/ptth_relay/src/lib.rs index eee569f..accceee 100644 --- a/crates/ptth_relay/src/lib.rs +++ b/crates/ptth_relay/src/lib.rs @@ -316,10 +316,7 @@ async fn handle_unregistered_servers_internal (state: &Arc ) let now = Utc::now (); - let server_list = { - let guard = state.unregistered_servers.read ().await; - (*guard).clone () - }; + let server_list = state.unregistered_servers.to_vec ().await; let unregistered_servers = server_list.into_iter () .map (|x| { diff --git a/crates/ptth_relay/src/relay_state.rs b/crates/ptth_relay/src/relay_state.rs index f718e84..55beedc 100644 --- a/crates/ptth_relay/src/relay_state.rs +++ b/crates/ptth_relay/src/relay_state.rs @@ -84,7 +84,7 @@ pub struct RelayState { pub shutdown_watch_rx: watch::Receiver , // List of recently rejected server names (Used to approve servers) - pub unregistered_servers: RwLock >, + pub unregistered_servers: BoundedVec , } pub struct BoundedVec { @@ -93,12 +93,23 @@ pub struct BoundedVec { } impl BoundedVec { + pub fn new (bound: usize) -> Self { + Self { + bound, + v: Default::default (), + } + } + pub async fn to_vec (&self) -> Vec { let guard = self.v.read ().await; (*guard).clone () } - pub async fn push (&mut self, x: T) { + // Not mut because we have a RwLock + // One of the only problems with Rust is that + // 'mut' doesn't _really_ -mean 'mutable' once you're + // multi-threading or using async + pub async fn push (&self, x: T) { let mut guard = self.v.write ().await; guard.push (x); @@ -128,7 +139,7 @@ impl TryFrom for RelayState { response_rendezvous: Default::default (), shutdown_watch_tx, shutdown_watch_rx, - unregistered_servers: Default::default (), + unregistered_servers: BoundedVec::new (20), }) } } diff --git a/crates/ptth_relay/src/server_endpoint.rs b/crates/ptth_relay/src/server_endpoint.rs index 6319d0e..868c2cc 100644 --- a/crates/ptth_relay/src/server_endpoint.rs +++ b/crates/ptth_relay/src/server_endpoint.rs @@ -63,16 +63,11 @@ pub async fn handle_listen ( match config.servers.get (&watcher_code) { None => { error! ("Denied http_listen for non-existent server name {}", watcher_code); - let mut guard = state.unregistered_servers.write ().await; - guard.push (crate::RejectedServer { + state.unregistered_servers.push (crate::RejectedServer { name: watcher_code, tripcode: actual_tripcode, seen: now, - }); - - while guard.len () > 20 { - guard.remove (0); - } + }).await; return trip_error (); },