cli: Improve errors and code for syncing

We distinguish between the cases:

a) There are no seeds at all.
b) There are no seeds to announce to despite the user wanting a higher
   replication factor, for example.
This commit is contained in:
cloudhead 2024-03-22 15:04:00 +01:00
parent ff79d15bb8
commit 3535170f2d
No known key found for this signature in database
1 changed files with 13 additions and 11 deletions

View File

@ -190,20 +190,22 @@ fn announce_<R: ReadRepository>(
let unsynced: Vec<_> = if doc.visibility.is_public() {
// All seeds.
let all = node.seeds(rid)?;
if all.is_empty() {
term::info!(&mut reporting.completion; "No seeds found for {rid}.");
return Ok(AnnounceResult::default());
}
// Seeds in sync with us.
let synced = all.iter().filter(|s| s.is_synced());
// Replicas not counting our local replica.
let replicas = all
let synced = all
.iter()
.filter(|s| s.is_synced() && &s.nid != profile.id())
.count();
.filter(|s| s.is_synced())
.map(|s| s.nid)
.collect::<BTreeSet<_>>();
// Replicas not counting our local replica.
let replicas = synced.iter().filter(|nid| *nid != profile.id()).count();
// Maximum replication factor we can achieve.
let max_replicas = all.iter().filter(|s| &s.nid != profile.id()).count();
// If the seeds we specified in the sync settings are all synced.
let is_seeds_synced = {
let synced = synced.map(|s| s.nid).collect::<BTreeSet<_>>();
settings.seeds.iter().all(|s| synced.contains(s))
};
let is_seeds_synced = settings.seeds.iter().all(|s| synced.contains(s));
// If we met our desired replica count. Note that this can never exceed the maximum count.
let is_replicas_synced = replicas >= settings.replicas.min(max_replicas);
@ -217,7 +219,7 @@ fn announce_<R: ReadRepository>(
}
// Return nodes we can announce to.
all.connected()
.filter(|s| !s.is_synced())
.filter(|s| !s.is_synced() && &s.nid != profile.id())
.map(|s| s.nid)
.collect()
} else {
@ -229,7 +231,7 @@ fn announce_<R: ReadRepository>(
};
if unsynced.is_empty() {
term::info!(&mut reporting.completion; "Not connected to any seeds for {rid}.");
term::info!(&mut reporting.completion; "No seeds to announce to for {rid}. (see `rad sync status`)");
return Ok(AnnounceResult::default());
}