diff --git a/crates/node/builder/src/builder/mod.rs b/crates/node/builder/src/builder/mod.rs index 506a31616e..449e40d6dd 100644 --- a/crates/node/builder/src/builder/mod.rs +++ b/crates/node/builder/src/builder/mod.rs @@ -32,7 +32,7 @@ use reth_node_core::{ primitives::Head, }; use reth_provider::{ - providers::{BlockchainProvider, NodeTypesForProvider}, + providers::{BlockchainProvider, NodeTypesForProvider, RocksDBProvider}, ChainSpecProvider, FullProvider, }; use reth_tasks::TaskExecutor; @@ -154,12 +154,14 @@ pub struct NodeBuilder { config: NodeConfig, /// The configured database for the node. database: DB, + /// An optional [`RocksDBProvider`] to use instead of creating one during launch. + rocksdb_provider: Option, } impl NodeBuilder<(), ChainSpec> { /// Create a new [`NodeBuilder`]. pub const fn new(config: NodeConfig) -> Self { - Self { config, database: () } + Self { config, database: (), rocksdb_provider: None } } } @@ -228,7 +230,13 @@ impl NodeBuilder { impl NodeBuilder { /// Configures the underlying database that the node will use. pub fn with_database(self, database: D) -> NodeBuilder { - NodeBuilder { config: self.config, database } + NodeBuilder { config: self.config, database, rocksdb_provider: self.rocksdb_provider } + } + + /// Sets the [`RocksDBProvider`] to use instead of creating one during launch. + pub fn with_rocksdb_provider(mut self, rocksdb_provider: RocksDBProvider) -> Self { + self.rocksdb_provider = Some(rocksdb_provider); + self } /// Preconfigure the builder with the context to launch the node. @@ -297,7 +305,7 @@ where T: NodeTypesForProvider, P: FullProvider>, { - NodeBuilderWithTypes::new(self.config, self.database) + NodeBuilderWithTypes::new(self.config, self.database, self.rocksdb_provider) } /// Preconfigures the node with a specific node implementation. @@ -347,6 +355,12 @@ where DB: Database + DatabaseMetrics + Clone + Unpin + 'static, ChainSpec: EthChainSpec + EthereumHardforks, { + /// Sets the [`RocksDBProvider`] to use instead of creating one during launch. + pub fn with_rocksdb_provider(mut self, rocksdb_provider: RocksDBProvider) -> Self { + self.builder.rocksdb_provider = Some(rocksdb_provider); + self + } + /// Configures the types of the node. pub fn with_types(self) -> WithLaunchContext>> where diff --git a/crates/node/builder/src/builder/states.rs b/crates/node/builder/src/builder/states.rs index bc9b146722..de76b61dea 100644 --- a/crates/node/builder/src/builder/states.rs +++ b/crates/node/builder/src/builder/states.rs @@ -16,6 +16,7 @@ use crate::{ use reth_exex::ExExContext; use reth_node_api::{FullNodeComponents, FullNodeTypes, NodeAddOns, NodeTypes}; use reth_node_core::node_config::NodeConfig; +use reth_provider::providers::RocksDBProvider; use reth_tasks::TaskExecutor; use std::{fmt, fmt::Debug, future::Future}; @@ -25,6 +26,8 @@ pub struct NodeBuilderWithTypes { config: NodeConfig<::ChainSpec>, /// The configured database for the node. adapter: NodeTypesAdapter, + /// An optional [`RocksDBProvider`] to use instead of creating one during launch. + rocksdb_provider: Option, } impl NodeBuilderWithTypes { @@ -32,8 +35,9 @@ impl NodeBuilderWithTypes { pub const fn new( config: NodeConfig<::ChainSpec>, database: T::DB, + rocksdb_provider: Option, ) -> Self { - Self { config, adapter: NodeTypesAdapter::new(database) } + Self { config, adapter: NodeTypesAdapter::new(database), rocksdb_provider } } /// Advances the state of the node builder to the next state where all components are configured @@ -41,11 +45,12 @@ impl NodeBuilderWithTypes { where CB: NodeComponentsBuilder, { - let Self { config, adapter } = self; + let Self { config, adapter, rocksdb_provider } = self; NodeBuilderWithComponents { config, adapter, + rocksdb_provider, components_builder, add_ons: AddOns { hooks: NodeHooks::default(), exexs: Vec::new(), add_ons: () }, } @@ -150,6 +155,8 @@ pub struct NodeBuilderWithComponents< pub config: NodeConfig<::ChainSpec>, /// Adapter for the underlying node types and database pub adapter: NodeTypesAdapter, + /// An optional [`RocksDBProvider`] to use instead of creating one during launch. + pub rocksdb_provider: Option, /// container for type specific components pub components_builder: CB, /// Additional node extensions. @@ -167,11 +174,12 @@ where where AO: NodeAddOns>, { - let Self { config, adapter, components_builder, .. } = self; + let Self { config, adapter, rocksdb_provider, components_builder, .. } = self; NodeBuilderWithComponents { config, adapter, + rocksdb_provider, components_builder, add_ons: AddOns { hooks: NodeHooks::default(), exexs: Vec::new(), add_ons }, } diff --git a/crates/node/builder/src/launch/common.rs b/crates/node/builder/src/launch/common.rs index 537cca6f46..6535393f2d 100644 --- a/crates/node/builder/src/launch/common.rs +++ b/crates/node/builder/src/launch/common.rs @@ -472,6 +472,7 @@ where pub async fn create_provider_factory( &self, changeset_cache: ChangesetCache, + rocksdb_provider: Option, ) -> eyre::Result> where N: ProviderNodeTypes, @@ -489,12 +490,16 @@ where .with_genesis_block_number(self.chain_spec().genesis().number.unwrap_or_default()) .build()?; - // Initialize RocksDB provider with metrics, statistics, and default tables - let rocksdb_provider = RocksDBProvider::builder(self.data_dir().rocksdb()) - .with_default_tables() - .with_metrics() - .with_statistics() - .build()?; + // Use the provided RocksDB provider or create a new one + let rocksdb_provider = if let Some(provider) = rocksdb_provider { + provider + } else { + RocksDBProvider::builder(self.data_dir().rocksdb()) + .with_default_tables() + .with_metrics() + .with_statistics() + .build()? + }; let factory = ProviderFactory::new( self.right().clone(), @@ -573,12 +578,14 @@ where pub async fn with_provider_factory( self, changeset_cache: ChangesetCache, + rocksdb_provider: Option, ) -> eyre::Result, ProviderFactory>>> where N: ProviderNodeTypes, Evm: ConfigureEvm + 'static, { - let factory = self.create_provider_factory::(changeset_cache).await?; + let factory = + self.create_provider_factory::(changeset_cache, rocksdb_provider).await?; let ctx = LaunchContextWith { inner: self.inner, attachment: self.attachment.map_right(|_| factory), diff --git a/crates/node/builder/src/launch/engine.rs b/crates/node/builder/src/launch/engine.rs index bbc4d8e435..afad49e73e 100644 --- a/crates/node/builder/src/launch/engine.rs +++ b/crates/node/builder/src/launch/engine.rs @@ -81,6 +81,7 @@ impl EngineNodeLauncher { let Self { ctx, engine_tree_config } = self; let NodeBuilderWithComponents { adapter: NodeTypesAdapter { database }, + rocksdb_provider, components_builder, add_ons: AddOns { hooks, exexs: installed_exex, add_ons }, config, @@ -102,7 +103,7 @@ impl EngineNodeLauncher { // ensure certain settings take effect .with_adjusted_configs() // Create the provider factory with changeset cache - .with_provider_factory::<_, >::Evm>(changeset_cache.clone()).await? + .with_provider_factory::<_, >::Evm>(changeset_cache.clone(), rocksdb_provider).await? .inspect(|_| { info!(target: "reth::cli", "Database opened"); })