summaryrefslogtreecommitdiffstats
path: root/src/state/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/mod.rs')
-rw-r--r--src/state/mod.rs13
1 files changed, 13 insertions, 0 deletions
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<Mutex<PeerState>>)> {
+ 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<Arc<Mutex<PeerState>>> {