use crate::{ types::{Epoch, Epocher, ViewDelta}, Block, }; use commonware_cryptography::certificate::Provider; use commonware_parallel::Strategy; use commonware_runtime::buffer::paged::CacheRef; use std::num::{NonZeroU64, NonZeroUsize}; /// Marshal configuration. /// /// # Epocher and Provider Coverage /// /// Any height marshal is asked to sync must be covered by both the /// [epocher](Self::epocher) and the [provider](Self::provider). If /// either returns `None` for a requested height, resolved requests will /// be acknowledged and then dropped. If no longer needed (say a duplicate request /// for a height we've long since processed), this drop is harmless. However, failing /// to provide either the epocher or the provider for a height we still require to /// process the canonical chain will lead marshal to stall (acknowledged requests /// may not be retried). /// /// ## Safe Pruning /// /// Applications may prune epocher/provider entries once the last processed /// height passes a prune target. The last processed height can be /// derived from an `Update::Block` at height `H` as /// `H - max_pending_acks` (the maximum backlog of blocks the application can buffer). pub struct Config where B: Block, P: Provider, ES: Epocher, T: Strategy, { /// Provider for epoch-specific signing schemes. /// /// Must cover every epoch that contains heights the marshal will sync. pub provider: P, /// Configuration for epoch lengths across block height ranges. /// /// Must cover every height the marshal will sync. pub epocher: ES, /// The prefix to use for all partitions. pub partition_prefix: String, /// Size of backfill request/response mailbox. pub mailbox_size: usize, /// Minimum number of views to retain temporary data after the application processes a block. /// /// Useful for keeping around information that peers may desire to have. pub view_retention_timeout: ViewDelta, /// Prunable archive partition prefix. pub prunable_items_per_section: NonZeroU64, /// The page cache to use for the freezer journal. pub page_cache: CacheRef, /// The size of the replay buffer for storage archives. pub replay_buffer: NonZeroUsize, /// The size of the write buffer for the key journal of storage archives. pub key_write_buffer: NonZeroUsize, /// The size of the write buffer for the value journal of storage archives. pub value_write_buffer: NonZeroUsize, /// Codec configuration for block type. pub block_codec_config: B::Cfg, /// Maximum number of blocks to repair at once. pub max_repair: NonZeroUsize, /// Maximum number of blocks dispatched to the application that have not /// yet been acknowledged. Increasing this value allows the application /// to buffer work while marshal continues dispatching, hiding ack latency. pub max_pending_acks: NonZeroUsize, /// Strategy for parallel operations. pub strategy: T, }