From d9b97e010db43e7307d095f215a889c7b851683c Mon Sep 17 00:00:00 2001 From: tv Date: Mon, 26 Oct 2026 23:36:14 +0100 Subject: describe remake test failures in simulation --- src/remake/api.rs | 30 ++++++++++++++++++++++++++++++ src/simtest/mod.rs | 3 +++ 2 files changed, 33 insertions(+) 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(host: &H) -> Vec { + 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, ®ister), + 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; -- cgit v1.3.1