use alloy_primitives::B256;
use crate::cold_start::plan::ColdStartPlan;
use crate::cold_start::results::ColdStartResults;
use crate::freshness::SlotFetch;
#[derive(Clone, Debug)]
pub struct ColdStartConfig {
pub max_rounds: usize,
pub pin: ColdStartPin,
}
impl Default for ColdStartConfig {
fn default() -> Self {
Self {
max_rounds: 8,
pin: ColdStartPin::CachePinned,
}
}
}
#[derive(Clone, Debug)]
pub enum ColdStartPin {
CachePinned,
Hash {
number: u64,
hash: B256,
require_canonical: bool,
},
}
#[derive(Clone, Debug, Default)]
pub struct ColdStartRunReport {
pub rounds: usize,
pub verified_slots: usize,
pub changed_slots: usize,
pub discovered_accounts: usize,
pub discovered_slots: usize,
pub failed_slots: usize,
pub per_round: Vec<ColdStartRoundSummary>,
}
#[derive(Clone, Debug, Default)]
pub struct ColdStartRoundSummary {
pub verify_requested: usize,
pub verify_changed: usize,
pub verify_failed: usize,
pub probe_requested: usize,
pub probe_failed: usize,
pub probe_roots_requested: usize,
pub probe_roots_failed: usize,
pub discover_calls: usize,
pub discovered_slots: usize,
}
impl ColdStartRunReport {
pub(crate) fn absorb_round(&mut self, plan: &ColdStartPlan, results: &ColdStartResults) {
self.rounds += 1;
let verify_failed = results
.fetched
.iter()
.filter(|o| matches!(o.fetch, SlotFetch::FetchFailed { .. }))
.count();
let probe_failed = results
.probed
.iter()
.filter(|o| matches!(o.fetch, SlotFetch::FetchFailed { .. }))
.count();
let probe_roots_failed = results
.probed_roots
.iter()
.filter(|o| o.root.is_none())
.count();
let discovered_slots: usize = results
.discovered
.iter()
.map(|d| d.access.slots.len())
.sum();
let discovered_accounts: usize = results
.discovered
.iter()
.map(|d| d.access.accounts.len())
.sum();
self.verified_slots += plan.verify.len();
self.changed_slots += results.verified.len();
self.failed_slots += verify_failed + probe_failed;
self.discovered_slots += discovered_slots;
self.discovered_accounts += discovered_accounts;
self.per_round.push(ColdStartRoundSummary {
verify_requested: plan.verify.len(),
verify_changed: results.verified.len(),
verify_failed,
probe_requested: plan.probe.len(),
probe_failed,
probe_roots_requested: plan.probe_roots.len(),
probe_roots_failed,
discover_calls: plan.discover.len(),
discovered_slots,
});
}
}