Merge pull request #835 from input-output-hk/chore/update-refs
chore: Update antithesis Dockerfile git refs
chore: Update antithesis Dockerfile git refs
Signed-off-by: Chris Gianelloni <[email protected]>
Extract cardano-node revisions from flake.lock and pass them as Docker build args to the cardano-node and cardano-node-bp images, so the two Haskell builds stay in lockstep with the Nix-pinned versions without manual Dockerfile edits. ouroboros-consensus is intentionally left on the Dockerfile default because flake.lock currently trails the Dockerfile and syncing would silently downgrade immdb-server. Signed-off-by: Chris Gianelloni <[email protected]>
Signed-off-by: Chris Gianelloni <[email protected]>
sim-rs: Add timestamp quantization and TX batching to sequential engine
sim-rs: Add tx backlog instrumentation and configurable cap
sim-rs: Add sequential DES engine and multi-shard parallel simulation
The flag was parsed but never wired into the simulation. The sim uses virtual time and already runs as fast as possible. Co-Authored-By: Claude Opus 4.6 <[email protected]>
finish_task() previously sent a ClockEvent::FinishTask through the same mpsc channel as Wait/CancelWait events, creating contention. Now it does an atomic fetch_sub and signals a Notify, letting the coordinator wake without channel round-trips. Also handles the resulting race where time can advance before a Wait event arrives. Co-Authored-By: Claude Opus 4.6 <[email protected]>
VTBundleNotGenerated events were already emitted but silently ignored by EventMonitor. Count them by NoVoteReason and print a breakdown after the vote stats, making issues like LateRBHeader immediately visible. Co-Authored-By: Claude Opus 4.6 <[email protected]>
Transactions in the per-node txs HashMap were never cleaned up, causing unbounded memory growth proportional to node count * total transactions. Prune transactions that are both older than a configurable max age and no longer present in the mempool. The mempool check ensures TXs that could still be included in future EBs (if previous voting failed) are retained. New config option `linear-tx-max-age-slots` (default: null/disabled). Co-Authored-By: Claude Opus 4.6 <[email protected]>
Co-Authored-By: Claude Opus 4.6 <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Linear Leios and Stracciatella variants don't produce IBs, so the end-of-run stats were printing empty/NaN IB lines. Gate all IB stats, IB-in-EB stats, IB latency, and IB network messages on a new LeiosVariant::has_ibs() method. Co-Authored-By: Claude Opus 4.6 <[email protected]>
Signed-off-by: Chris Gianelloni <[email protected]>
Signed-off-by: Chris Gianelloni <[email protected]>
The fragment.contains(&from) check added in 8065d81cc causes a fetch-fail-retry loop: after a block is fetched, its point is removed from all peer fragments (coordinator line 326). If a later FetchBlockRange uses that fetched block as `from`, no peer's fragment contains it, so the fetch fails immediately and retries forever. Revert to checking only `to`. The server-side get_range already handles unknown `from` by returning the prefix up to `to` — this is intentional fork-aware behavior (chain_store.rs line 235-240). Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
When block production stops (p=0), the network previously froze completely — select_chain only ran on incoming network events, so with no new blocks there were no events to trigger retries of stale fetches or pending_validation deadlocks. Add retry_select_chain() to PraosConsensus: evicts stale in_flight entries and re-runs select_chain when there is actionable state (stale evictions, in-flight fetches, or pending_validation entries). Called every 5 slots (~5s) from the main loop's slot tick. Cluster testing confirms: after setting p=0, most nodes now converge to the majority tip. Three nodes remain stuck due to a separate pending_validation ordering issue (blocks arrive but parents are missing — needs further investigation). Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Aligns PeerChain with Haskell's AnchoredFragment pattern: the ChainSync intersection point is stored as an explicit anchor on each peer's candidate chain. When select_chain_once's walk through PeerChain entries fails to find a common ancestor (narrow window after reconnection), the anchor provides a guaranteed fallback. Changes: - Forward NetworkEvent::IntersectionFound from coordinator to consensus (previously swallowed at the coordinator level) - Add PeerChainAnchor struct and anchor field to PeerChain, set from IntersectionFound, persists through rollbacks - Add anchor fallback in select_chain_once after the walk and prev_hash fallback both fail - Detect gap between anchor and oldest PeerChain entry; thread anchor_point through WaitingForBlocks to issue_fetch so the fetch range starts from the anchor, filling the gap via BlockFetch Three new tests: anchor_set_on_intersection_found, anchor_used_as_fallback_ancestor, anchor_ignored_when_walk_succeeds. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>