summaryrefslogtreecommitdiffstats
path: root/src/swarm/state_file.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/swarm/state_file.rs')
-rw-r--r--src/swarm/state_file.rs21
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
}