diff options
Diffstat (limited to 'src/swarm/state_file.rs')
| -rw-r--r-- | src/swarm/state_file.rs | 21 |
1 files changed, 14 insertions, 7 deletions
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<String>, } @@ -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<String> { let (mut stable, transient): (Vec<String>, Vec<String>) = 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<String> = 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 } |
