summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-10-26 23:36:14 +0100
committertv <tv@krebsco.de>2026-10-26 23:36:14 +0100
commitd9b97e010db43e7307d095f215a889c7b851683c (patch)
tree7471088572a160acde30f2ac3c5b5354aeb2b97b
parent813f9c57d227a686c6fb08137a2b6b26e9986ef4 (diff)
describe remake test failures in simulation
-rw-r--r--src/remake/api.rs30
-rw-r--r--src/simtest/mod.rs3
2 files changed, 33 insertions, 0 deletions
diff --git a/src/remake/api.rs b/src/remake/api.rs
index 309bdbd..52338dd 100644
--- a/src/remake/api.rs
+++ b/src/remake/api.rs
@@ -1063,4 +1063,34 @@ pub(crate) mod testing {
let report = load_report(host, id).await?;
Some(serde_json::to_value(report).expect("report"))
}
+
+ /// One line per remake record, for test failures: phase, timing (relative to now),
+ /// decision and tally.
+ pub(crate) async fn describe<H: Host>(host: &H) -> Vec<String> {
+ let (all, register) = host
+ .read_doc(|doc| (records::load_all(doc), records::load_register(doc)))
+ .await;
+ let now = host.now_millis();
+ let grace = host.dormant_after().as_millis() as u64;
+ let relative = |at: UnixMillis| at.0 as i64 - now.0 as i64;
+ all.iter()
+ .map(|(id, record)| {
+ let proposal = &record.proposal;
+ format!(
+ "remake {id}: phase={:?} coordinator={} from={:?} proposed_at={}ms \
+ settle_until={}ms tally=({}) decision={:?} abort_requested={} \
+ contested={}",
+ record.phase(now, grace),
+ proposal.coordinator,
+ proposal.from_epoch,
+ relative(proposal.proposed_at),
+ relative(proposal.settle_until),
+ vote::tally(id, record, &all, &register),
+ record.decision,
+ record.abort_requested.is_some(),
+ record.contested,
+ )
+ })
+ .collect()
+ }
}
diff --git a/src/simtest/mod.rs b/src/simtest/mod.rs
index eb5a741..04b5396 100644
--- a/src/simtest/mod.rs
+++ b/src/simtest/mod.rs
@@ -202,6 +202,9 @@ impl Sim {
.load(std::sync::atomic::Ordering::Acquire),
);
let _ = writeln!(out, " view: {:?}", *node.neighbours.read_or_recover());
+ for remake in crate::remake::testing::describe(node).await {
+ let _ = writeln!(out, " {remake}");
+ }
let peers = node.peers_snapshot().await;
for (peer, peer_state) in peers {
let p = peer_state.lock().await;