From 2f3d191a12b6e03ef1845c202d15c7b90736558c Mon Sep 17 00:00:00 2001 From: tv Date: Mon, 26 Oct 2026 04:24:52 +0100 Subject: unify peers snapshot logic --- src/state/mod.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/state/mod.rs') diff --git a/src/state/mod.rs b/src/state/mod.rs index 3336b00..1c31c61 100644 --- a/src/state/mod.rs +++ b/src/state/mod.rs @@ -280,6 +280,19 @@ impl AppState { Ok(()) } + /// Every known peer with its state, copied out of the peer map. Lock a peer's state + /// only from such a copy, never while holding the map's lock: the map would then + /// wait for the peer, and with it everything that only needs the map (a lookup, a + /// new peer). + pub(crate) async fn peers_snapshot(&self) -> Vec<(String, Arc>)> { + self.peer_states + .read() + .await + .iter() + .map(|(peer, state)| (peer.clone(), Arc::clone(state))) + .collect() + } + /// Looks up a peer without creating it. Background work (sync, retries, /// keepalives) must use this so a forgotten peer isn't resurrected. pub(crate) async fn get_peer_state(&self, pk: &str) -> Option>> { -- cgit v1.3.1