From 5fd686dcd8ddfbdf276c044e5acf03f744e03193 Mon Sep 17 00:00:00 2001 From: tv Date: Tue, 27 Oct 2026 01:01:51 +0100 Subject: introduce addresses --- src/swarm/state_file.rs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'src/swarm/state_file.rs') diff --git a/src/swarm/state_file.rs b/src/swarm/state_file.rs index 73b80a2..3693d89 100644 --- a/src/swarm/state_file.rs +++ b/src/swarm/state_file.rs @@ -31,7 +31,8 @@ const MIN_WRITE_INTERVAL: Duration = Duration::from_secs(3600); #[serde(rename_all = "camelCase")] pub(crate) struct Remembered { pub(crate) swarm_id: String, - /// Public keys of members to join through (sorted). + /// Addresses of members to join through (sorted), as their member list entries give + /// them (`swarm::members::addresses`). #[serde(default)] pub(crate) seeds: Vec, } @@ -173,16 +174,22 @@ pub(crate) async fn update(state: &AppState, now: bool) { } } -/// Members to rejoin through: those alive within the electorate window, stable ones -/// first, at most `MAX_SEEDS`, sorted. Changes only when members join, leave or change -/// tier, so the file rarely does. +/// Where to rejoin through: the addresses of members alive within the electorate +/// window, stable ones first, of at most `MAX_SEEDS` members, sorted. Changes only when +/// members join, leave, move or change tier, so the file rarely does. fn seeds(doc: &automerge::AutoCommit, me: &str, window: Duration, now: u64) -> Vec { let (mut stable, transient): (Vec, Vec) = members::electorate(doc, now, window) .into_iter() .filter(|pk| pk != me) .partition(|pk| members::tier(doc, pk) == members::Tier::Stable); stable.extend(transient); - stable.truncate(MAX_SEEDS); - stable.sort(); - stable + let mut seeds: Vec = stable + .iter() + .filter(|pk| !members::addresses(doc, pk).is_empty()) + .take(MAX_SEEDS) + .flat_map(|pk| members::addresses(doc, pk)) + .collect(); + seeds.sort(); + seeds.dedup(); + seeds } -- cgit v1.3.1