cli: Use current local tip in `rad sync status`
In the case of an out-of-sync local node, we were showing the wrong tip. Additionally, mark your tip as unannounced if it isn't announced. This isn't fool-proof, but can be useful to debug certain issues.
This commit is contained in:
parent
f78e5a4281
commit
191278f0d9
|
|
@ -7,14 +7,15 @@ For instance let's create an issue and sync it with the network:
|
||||||
$ rad issue open --title "Test `rad sync`" --description "Check that the command works" -q --no-announce
|
$ rad issue open --title "Test `rad sync`" --description "Check that the command works" -q --no-announce
|
||||||
```
|
```
|
||||||
|
|
||||||
If we check the sync status, we see that our peers are out of sync.
|
If we check the sync status, we see that our peers are out of sync, and our
|
||||||
|
change has not yet been announced.
|
||||||
|
|
||||||
```
|
```
|
||||||
$ rad sync status --sort-by alias
|
$ rad sync status --sort-by alias
|
||||||
╭──────────────────────────────────────────────────────────────────────────────────────────────╮
|
╭──────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
│ ● Node Address Status Tip Timestamp │
|
│ ● Node Address Status Tip Timestamp │
|
||||||
├──────────────────────────────────────────────────────────────────────────────────────────────┤
|
├──────────────────────────────────────────────────────────────────────────────────────────────┤
|
||||||
│ ● alice (you) alice.radicle.example:8776 f209c9f [ ... ] │
|
│ ● alice (you) alice.radicle.example:8776 unannounced a9ce0d1 [ ... ] │
|
||||||
│ ● bob z6Mkt67…v4N1tRk bob.radicle.example:8776 out-of-sync f209c9f [ ... ] │
|
│ ● bob z6Mkt67…v4N1tRk bob.radicle.example:8776 out-of-sync f209c9f [ ... ] │
|
||||||
│ ● eve z6Mkux1…nVhib7Z eve.radicle.example:8776 out-of-sync f209c9f [ ... ] │
|
│ ● eve z6Mkux1…nVhib7Z eve.radicle.example:8776 out-of-sync f209c9f [ ... ] │
|
||||||
╰──────────────────────────────────────────────────────────────────────────────────────────────╯
|
╰──────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
|
|
|
||||||
|
|
@ -317,7 +317,7 @@ fn sync_status(
|
||||||
) -> anyhow::Result<()> {
|
) -> anyhow::Result<()> {
|
||||||
let mut table = Table::<7, term::Label>::new(TableOptions::bordered());
|
let mut table = Table::<7, term::Label>::new(TableOptions::bordered());
|
||||||
let mut seeds: Vec<_> = node.seeds(rid)?.into();
|
let mut seeds: Vec<_> = node.seeds(rid)?.into();
|
||||||
let local = node.nid()?;
|
let local_nid = node.nid()?;
|
||||||
let aliases = profile.aliases();
|
let aliases = profile.aliases();
|
||||||
|
|
||||||
table.push([
|
table.push([
|
||||||
|
|
@ -331,20 +331,32 @@ fn sync_status(
|
||||||
]);
|
]);
|
||||||
table.divider();
|
table.divider();
|
||||||
|
|
||||||
sort_seeds_by(local, &mut seeds, &aliases, &options.sort_by);
|
sort_seeds_by(local_nid, &mut seeds, &aliases, &options.sort_by);
|
||||||
|
|
||||||
for seed in seeds {
|
for seed in seeds {
|
||||||
let (icon, status, head, time) = match seed.sync {
|
let (icon, status, head, time) = match seed.sync {
|
||||||
Some(SyncStatus::Synced { at }) => (
|
Some(SyncStatus::Synced { at }) => (
|
||||||
term::format::positive("●"),
|
term::format::positive("●"),
|
||||||
term::format::positive(if seed.nid != local { "synced" } else { "" }),
|
term::format::positive(if seed.nid != local_nid { "synced" } else { "" }),
|
||||||
term::format::oid(at.oid),
|
term::format::oid(at.oid),
|
||||||
term::format::timestamp(at.timestamp),
|
term::format::timestamp(at.timestamp),
|
||||||
),
|
),
|
||||||
Some(SyncStatus::OutOfSync { remote, .. }) => (
|
Some(SyncStatus::OutOfSync { remote, local, .. }) => (
|
||||||
term::format::negative("●"),
|
if seed.nid != local_nid {
|
||||||
term::format::negative(if seed.nid != local { "out-of-sync" } else { "" }),
|
term::format::negative("●")
|
||||||
term::format::oid(remote.oid),
|
} else {
|
||||||
|
term::format::yellow("●")
|
||||||
|
},
|
||||||
|
if seed.nid != local_nid {
|
||||||
|
term::format::negative("out-of-sync")
|
||||||
|
} else {
|
||||||
|
term::format::yellow("unannounced")
|
||||||
|
},
|
||||||
|
term::format::oid(if seed.nid != local_nid {
|
||||||
|
remote.oid
|
||||||
|
} else {
|
||||||
|
local.oid
|
||||||
|
}),
|
||||||
term::format::timestamp(remote.timestamp),
|
term::format::timestamp(remote.timestamp),
|
||||||
),
|
),
|
||||||
None if options.verbose => (
|
None if options.verbose => (
|
||||||
|
|
|
||||||
|
|
@ -641,7 +641,6 @@ where
|
||||||
let Some(updated_at) = repo.synced_at else {
|
let Some(updated_at) = repo.synced_at else {
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Skip this repo if the sync status matches what we have in storage.
|
// Skip this repo if the sync status matches what we have in storage.
|
||||||
if let Some(announced) = announced.get(&rid) {
|
if let Some(announced) = announced.get(&rid) {
|
||||||
if updated_at.oid == announced.oid {
|
if updated_at.oid == announced.oid {
|
||||||
|
|
@ -657,7 +656,6 @@ where
|
||||||
)? {
|
)? {
|
||||||
debug!(target: "service", "Saved local sync status for {rid}..");
|
debug!(target: "service", "Saved local sync status for {rid}..");
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we got here, it likely means a repo was updated while the node was stopped.
|
// If we got here, it likely means a repo was updated while the node was stopped.
|
||||||
// Therefore, we pre-load a refs announcement for this repo, so that it is included in
|
// Therefore, we pre-load a refs announcement for this repo, so that it is included in
|
||||||
// the historical gossip messages when a node connects and subscribes to this repo.
|
// the historical gossip messages when a node connects and subscribes to this repo.
|
||||||
|
|
@ -1989,20 +1987,21 @@ where
|
||||||
|
|
||||||
// Update our sync status for our own refs. This is useful for determining if refs were
|
// Update our sync status for our own refs. This is useful for determining if refs were
|
||||||
// updated while the node was stopped.
|
// updated while the node was stopped.
|
||||||
// TODO: Move to `announce_own_refs`.
|
|
||||||
if let Some(refs) = refs.iter().find(|r| r.remote == ann.node) {
|
if let Some(refs) = refs.iter().find(|r| r.remote == ann.node) {
|
||||||
info!(
|
info!(
|
||||||
target: "service",
|
target: "service",
|
||||||
"Announcing own refs for {rid} to peers ({}) (t={timestamp})..",
|
"Announcing own refs for {rid} to peers ({}) (t={timestamp})..",
|
||||||
refs.at
|
refs.at
|
||||||
);
|
);
|
||||||
|
// Update our local node's sync status to mark the refs as announced.
|
||||||
if let Err(e) = self
|
if let Err(e) = self
|
||||||
.db
|
.db
|
||||||
.seeds_mut()
|
.seeds_mut()
|
||||||
.synced(&rid, &ann.node, refs.at, timestamp)
|
.synced(&rid, &ann.node, refs.at, timestamp)
|
||||||
{
|
{
|
||||||
error!(target: "service", "Error updating sync status for local node: {e}");
|
error!(target: "service", "Error updating sync status for local node: {e}");
|
||||||
|
} else {
|
||||||
|
debug!(target: "service", "Saved local sync status for {rid}..");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue