diff --git a/bin/reth/src/node/mod.rs b/bin/reth/src/node/mod.rs index b7b4c520c..21f0de45b 100644 --- a/bin/reth/src/node/mod.rs +++ b/bin/reth/src/node/mod.rs @@ -304,7 +304,8 @@ impl NodeCommand { debug!(target: "reth::cli", "configured blockchain tree"); // fetch the head block from the database - let head = self.lookup_head(Arc::clone(&db)).wrap_err("the head block is missing")?; + let head = + self.lookup_head(provider_factory.clone()).wrap_err("the head block is missing")?; // setup the blockchain provider let blockchain_db = @@ -346,7 +347,7 @@ impl NodeCommand { let default_peers_path = data_dir.known_peers_path(); let network_config = self.load_network_config( &config, - Arc::clone(&db), + provider_factory.clone(), ctx.task_executor.clone(), head, secret_key, @@ -389,7 +390,7 @@ impl NodeCommand { let max_block = if let Some(block) = self.debug.max_block { Some(block) } else if let Some(tip) = self.debug.tip { - Some(self.lookup_or_fetch_tip(&db, &network_client, tip).await?) + Some(self.lookup_or_fetch_tip(provider_factory.clone(), &network_client, tip).await?) } else { None }; @@ -425,7 +426,7 @@ impl NodeCommand { &config.stages, client.clone(), Arc::clone(&consensus), - provider_factory, + provider_factory.clone(), &ctx.task_executor, sync_metrics_tx, prune_config.clone(), @@ -445,7 +446,7 @@ impl NodeCommand { &config.stages, network_client.clone(), Arc::clone(&consensus), - provider_factory, + provider_factory.clone(), &ctx.task_executor, sync_metrics_tx, prune_config.clone(), @@ -476,7 +477,7 @@ impl NodeCommand { let pruner_events = if let Some(prune_config) = prune_config { let mut pruner = self.build_pruner( &prune_config, - db.clone(), + provider_factory, tree_config, snapshotter.highest_snapshot_receiver(), ); @@ -747,8 +748,7 @@ impl NodeCommand { /// Fetches the head block from the database. /// /// If the database is empty, returns the genesis block. - fn lookup_head(&self, db: DB) -> RethResult { - let factory = ProviderFactory::new(db, self.chain.clone()); + fn lookup_head(&self, factory: ProviderFactory) -> RethResult { let provider = factory.provider()?; let head = provider.get_stage_checkpoint(StageId::Finish)?.unwrap_or_default().block_number; @@ -780,7 +780,7 @@ impl NodeCommand { /// NOTE: The download is attempted with infinite retries. async fn lookup_or_fetch_tip( &self, - db: DB, + provider_factory: ProviderFactory, client: Client, tip: B256, ) -> RethResult @@ -788,7 +788,7 @@ impl NodeCommand { DB: Database, Client: HeadersClient, { - Ok(self.fetch_tip(db, client, BlockHashOrNumber::Hash(tip)).await?.number) + Ok(self.fetch_tip(provider_factory, client, BlockHashOrNumber::Hash(tip)).await?.number) } /// Attempt to look up the block with the given number and return the header. @@ -796,7 +796,7 @@ impl NodeCommand { /// NOTE: The download is attempted with infinite retries. async fn fetch_tip( &self, - db: DB, + factory: ProviderFactory, client: Client, tip: BlockHashOrNumber, ) -> RethResult @@ -804,7 +804,6 @@ impl NodeCommand { DB: Database, Client: HeadersClient, { - let factory = ProviderFactory::new(db, self.chain.clone()); let provider = factory.provider()?; let header = provider.header_by_hash_or_number(tip)?; @@ -832,7 +831,7 @@ impl NodeCommand { fn load_network_config( &self, config: &Config, - db: DB, + provider_factory: ProviderFactory, executor: TaskExecutor, head: Head, secret_key: SecretKey, @@ -862,7 +861,7 @@ impl NodeCommand { .sequencer_endpoint(self.rollup.sequencer_http.clone()) .disable_tx_gossip(self.rollup.disable_txpool_gossip); - cfg_builder.build(ProviderFactory::new(db, self.chain.clone())) + cfg_builder.build(provider_factory) } #[allow(clippy::too_many_arguments)] @@ -980,7 +979,7 @@ impl NodeCommand { fn build_pruner( &self, config: &PruneConfig, - db: DB, + provider_factory: ProviderFactory, tree_config: BlockchainTreeConfig, highest_snapshots_rx: HighestSnapshotsTracker, ) -> Pruner { @@ -1014,8 +1013,7 @@ impl NodeCommand { ); Pruner::new( - db, - self.chain.clone(), + provider_factory, segments.into_vec(), config.block_interval, self.chain.prune_delete_limit, diff --git a/crates/consensus/beacon/src/engine/test_utils.rs b/crates/consensus/beacon/src/engine/test_utils.rs index ffe3874d3..8d2be2a1c 100644 --- a/crates/consensus/beacon/src/engine/test_utils.rs +++ b/crates/consensus/beacon/src/engine/test_utils.rs @@ -514,11 +514,11 @@ where BlockchainTree::new(externals, config, None).expect("failed to create tree"), ); let latest = self.base_config.chain_spec.genesis_header().seal_slow(); - let blockchain_provider = BlockchainProvider::with_latest(provider_factory, tree, latest); + let blockchain_provider = + BlockchainProvider::with_latest(provider_factory.clone(), tree, latest); let pruner = Pruner::new( - db.clone(), - self.base_config.chain_spec.clone(), + provider_factory, vec![], 5, self.base_config.chain_spec.prune_delete_limit, diff --git a/crates/prune/src/pruner.rs b/crates/prune/src/pruner.rs index a74825fd4..69e11d7ab 100644 --- a/crates/prune/src/pruner.rs +++ b/crates/prune/src/pruner.rs @@ -6,7 +6,7 @@ use crate::{ Metrics, PrunerError, PrunerEvent, }; use reth_db::database::Database; -use reth_primitives::{BlockNumber, ChainSpec, PruneMode, PruneProgress, PruneSegment}; +use reth_primitives::{BlockNumber, PruneMode, PruneProgress, PruneSegment}; use reth_provider::{ProviderFactory, PruneCheckpointReader}; use reth_snapshot::HighestSnapshotsTracker; use reth_tokio_util::EventListeners; @@ -46,8 +46,7 @@ pub struct Pruner { impl Pruner { /// Creates a new [Pruner]. pub fn new( - db: DB, - chain_spec: Arc, + provider_factory: ProviderFactory, segments: Vec>>, min_block_interval: usize, delete_limit: usize, @@ -55,7 +54,7 @@ impl Pruner { highest_snapshots_tracker: HighestSnapshotsTracker, ) -> Self { Self { - provider_factory: ProviderFactory::new(db, chain_spec), + provider_factory, segments, min_block_interval, previous_tip_block_number: None, @@ -267,12 +266,14 @@ mod tests { use crate::Pruner; use reth_db::test_utils::create_test_rw_db; use reth_primitives::MAINNET; + use reth_provider::ProviderFactory; use tokio::sync::watch; #[test] fn is_pruning_needed() { let db = create_test_rw_db(); - let mut pruner = Pruner::new(db, MAINNET.clone(), vec![], 5, 0, 5, watch::channel(None).1); + let provider_factory = ProviderFactory::new(db, MAINNET.clone()); + let mut pruner = Pruner::new(provider_factory, vec![], 5, 0, 5, watch::channel(None).1); // No last pruned block number was set before let first_block_number = 1;