use std::time::Duration; use crate::{segments::SegmentSet, Pruner}; use reth_config::PruneConfig; use reth_db::database::Database; use reth_primitives::{FinishedExExHeight, PruneModes, MAINNET}; use reth_provider::ProviderFactory; use tokio::sync::watch; /// Contains the information required to build a pruner #[derive(Debug, Clone)] pub struct PrunerBuilder { /// Minimum pruning interval measured in blocks. block_interval: usize, /// Pruning configuration for every part of the data that can be pruned. segments: PruneModes, /// The number of blocks that can be re-orged. max_reorg_depth: usize, /// The delete limit for pruner, per block. In the actual pruner run it will be multiplied by /// the amount of blocks between pruner runs to account for the difference in amount of new /// data coming in. prune_delete_limit: usize, /// Time a pruner job can run before timing out. timeout: Option, /// The finished height of all ExEx's. finished_exex_height: watch::Receiver, } impl PrunerBuilder { /// Default timeout for a prune run. pub const DEFAULT_TIMEOUT: Duration = Duration::from_millis(100); /// Creates a new [PrunerBuilder] from the given [PruneConfig]. pub fn new(pruner_config: PruneConfig) -> Self { PrunerBuilder::default() .block_interval(pruner_config.block_interval) .segments(pruner_config.segments) } /// Sets the minimum pruning interval measured in blocks. pub fn block_interval(mut self, block_interval: usize) -> Self { self.block_interval = block_interval; self } /// Sets the configuration for every part of the data that can be pruned. pub fn segments(mut self, segments: PruneModes) -> Self { self.segments = segments; self } /// Sets the number of blocks that can be re-orged. pub fn max_reorg_depth(mut self, max_reorg_depth: usize) -> Self { self.max_reorg_depth = max_reorg_depth; self } /// Sets the delete limit for pruner, per block. pub fn prune_delete_limit(mut self, prune_delete_limit: usize) -> Self { self.prune_delete_limit = prune_delete_limit; self } /// Sets the timeout for pruner, per run. /// /// CAUTION: Account and Storage History prune segments treat this timeout as a soft limit, /// meaning they can go beyond it. pub fn timeout(mut self, timeout: Duration) -> Self { self.timeout = Some(timeout); self } /// Sets the receiver for the finished height of all ExEx's. pub fn finished_exex_height( mut self, finished_exex_height: watch::Receiver, ) -> Self { self.finished_exex_height = finished_exex_height; self } /// Builds a [Pruner] from the current configuration. pub fn build(self, provider_factory: ProviderFactory) -> Pruner { let segments = SegmentSet::::from_prune_modes(self.segments); Pruner::new( provider_factory, segments.into_vec(), self.block_interval, self.prune_delete_limit, self.max_reorg_depth, self.timeout, self.finished_exex_height, ) } } impl Default for PrunerBuilder { fn default() -> Self { Self { block_interval: 5, segments: PruneModes::none(), max_reorg_depth: 64, prune_delete_limit: MAINNET.prune_delete_limit, timeout: Some(Self::DEFAULT_TIMEOUT), finished_exex_height: watch::channel(FinishedExExHeight::NoExExs).1, } } }