From 370a548f3413e2c96af48fd2bb58d810788a2162 Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Fri, 30 Jan 2026 13:54:50 -0800 Subject: [PATCH] refactor(db): derive Clone for DatabaseEnv (#21641) Co-authored-by: Amp --- crates/cli/commands/src/common.rs | 18 ++++---- crates/cli/commands/src/db/checksum/mod.rs | 5 +-- .../cli/commands/src/db/checksum/rocksdb.rs | 4 +- crates/cli/commands/src/db/diff.rs | 3 +- crates/cli/commands/src/db/list.rs | 6 +-- crates/cli/commands/src/db/stats.rs | 6 +-- crates/cli/commands/src/launcher.rs | 10 ++--- crates/cli/commands/src/node.rs | 2 +- .../cli/commands/src/stage/dump/execution.rs | 4 +- .../src/stage/dump/hashing_account.rs | 5 +-- .../src/stage/dump/hashing_storage.rs | 5 +-- crates/cli/commands/src/stage/dump/merkle.rs | 4 +- crates/cli/commands/src/stage/unwind.rs | 2 +- crates/e2e-test-utils/src/setup_import.rs | 36 ++++++++-------- crates/ethereum/cli/src/app.rs | 4 +- crates/ethereum/cli/src/interface.rs | 8 ++-- crates/ethereum/node/src/node.rs | 3 +- crates/node/builder/src/node.rs | 4 +- crates/optimism/cli/src/lib.rs | 6 +-- crates/optimism/node/src/node.rs | 3 +- crates/storage/db-common/src/init.rs | 4 +- .../db/src/implementation/mdbx/cursor.rs | 5 +-- .../storage/db/src/implementation/mdbx/mod.rs | 43 +++++++++---------- .../src/providers/database/builder.rs | 4 +- .../provider/src/providers/database/mod.rs | 6 +-- crates/storage/provider/src/test_utils/mod.rs | 4 +- examples/rpc-db/src/main.rs | 6 +-- 27 files changed, 99 insertions(+), 111 deletions(-) diff --git a/crates/cli/commands/src/common.rs b/crates/cli/commands/src/common.rs index 4cd8c29d7a..6769a75a90 100644 --- a/crates/cli/commands/src/common.rs +++ b/crates/cli/commands/src/common.rs @@ -121,13 +121,13 @@ impl EnvironmentArgs { let genesis_block_number = self.chain.genesis().number.unwrap_or_default(); let (db, sfp) = match access { AccessRights::RW => ( - Arc::new(init_db(db_path, self.db.database_args())?), + init_db(db_path, self.db.database_args())?, StaticFileProviderBuilder::read_write(sf_path) .with_genesis_block_number(genesis_block_number) .build()?, ), AccessRights::RO | AccessRights::RoInconsistent => { - (Arc::new(open_db_read_only(&db_path, self.db.database_args())?), { + (open_db_read_only(&db_path, self.db.database_args())?, { let provider = StaticFileProviderBuilder::read_only(sf_path) .with_genesis_block_number(genesis_block_number) .build()?; @@ -160,16 +160,16 @@ impl EnvironmentArgs { fn create_provider_factory( &self, config: &Config, - db: Arc, + db: DatabaseEnv, static_file_provider: StaticFileProvider, rocksdb_provider: RocksDBProvider, access: AccessRights, - ) -> eyre::Result>>> + ) -> eyre::Result>> where C: ChainSpecParser, { let prune_modes = config.prune.segments.clone(); - let factory = ProviderFactory::>>::new( + let factory = ProviderFactory::>::new( db, self.chain.clone(), static_file_provider, @@ -200,7 +200,7 @@ impl EnvironmentArgs { let (_tip_tx, tip_rx) = watch::channel(B256::ZERO); // Builds and executes an unwind-only pipeline - let mut pipeline = Pipeline::>>::builder() + let mut pipeline = Pipeline::>::builder() .add_stages(DefaultStages::new( factory.clone(), tip_rx, @@ -229,7 +229,7 @@ pub struct Environment { /// Configuration for reth node pub config: Config, /// Provider factory. - pub provider_factory: ProviderFactory>>, + pub provider_factory: ProviderFactory>, /// Datadir path. pub data_dir: ChainPath, } @@ -261,8 +261,8 @@ impl AccessRights { /// Helper alias to satisfy `FullNodeTypes` bound on [`Node`] trait generic. type FullTypesAdapter = FullNodeTypesAdapter< T, - Arc, - BlockchainProvider>>, + DatabaseEnv, + BlockchainProvider>, >; /// Helper trait with a common set of requirements for the diff --git a/crates/cli/commands/src/db/checksum/mod.rs b/crates/cli/commands/src/db/checksum/mod.rs index 37181a5d9b..b2d36c45d3 100644 --- a/crates/cli/commands/src/db/checksum/mod.rs +++ b/crates/cli/commands/src/db/checksum/mod.rs @@ -17,7 +17,6 @@ use reth_provider::{providers::ProviderNodeTypes, DBProvider, StaticFileProvider use reth_static_file_types::StaticFileSegment; use std::{ hash::{BuildHasher, Hasher}, - sync::Arc, time::{Duration, Instant}, }; use tracing::{info, warn}; @@ -90,7 +89,7 @@ impl Command { /// Execute `db checksum` command pub fn execute>( self, - tool: &DbTool>>, + tool: &DbTool>, ) -> eyre::Result<()> { warn!("This command should be run without the node running!"); @@ -117,7 +116,7 @@ fn checksum_hasher() -> impl Hasher { } fn checksum_static_file>( - tool: &DbTool>>, + tool: &DbTool>, segment: StaticFileSegment, start_block: Option, end_block: Option, diff --git a/crates/cli/commands/src/db/checksum/rocksdb.rs b/crates/cli/commands/src/db/checksum/rocksdb.rs index 4b4fe3bd6b..b30ddb87cf 100644 --- a/crates/cli/commands/src/db/checksum/rocksdb.rs +++ b/crates/cli/commands/src/db/checksum/rocksdb.rs @@ -9,7 +9,7 @@ use reth_db_api::table::Table; use reth_db_common::DbTool; use reth_node_builder::NodeTypesWithDBAdapter; use reth_provider::RocksDBProviderFactory; -use std::{hash::Hasher, sync::Arc, time::Instant}; +use std::{hash::Hasher, time::Instant}; use tracing::info; /// RocksDB tables that can be checksummed. @@ -36,7 +36,7 @@ impl RocksDbTable { /// Computes a checksum for a RocksDB table. pub fn checksum_rocksdb>( - tool: &DbTool>>, + tool: &DbTool>, table: RocksDbTable, limit: Option, ) -> eyre::Result<()> { diff --git a/crates/cli/commands/src/db/diff.rs b/crates/cli/commands/src/db/diff.rs index b22930302f..96e750d322 100644 --- a/crates/cli/commands/src/db/diff.rs +++ b/crates/cli/commands/src/db/diff.rs @@ -16,7 +16,6 @@ use std::{ hash::Hash, io::Write, path::{Path, PathBuf}, - sync::Arc, }; use tracing::{info, warn}; @@ -56,7 +55,7 @@ impl Command { /// then written to a file in the output directory. pub fn execute( self, - tool: &DbTool>>, + tool: &DbTool>, ) -> eyre::Result<()> { warn!("Make sure the node is not running when running `reth db diff`!"); // open second db diff --git a/crates/cli/commands/src/db/list.rs b/crates/cli/commands/src/db/list.rs index eee500eb53..77a321eff8 100644 --- a/crates/cli/commands/src/db/list.rs +++ b/crates/cli/commands/src/db/list.rs @@ -7,7 +7,7 @@ use reth_db::{transaction::DbTx, DatabaseEnv}; use reth_db_api::{database::Database, table::Table, RawValue, TableViewer, Tables}; use reth_db_common::{DbTool, ListFilter}; use reth_node_builder::{NodeTypes, NodeTypesWithDBAdapter}; -use std::{cell::RefCell, sync::Arc}; +use std::cell::RefCell; use tracing::error; #[derive(Parser, Debug)] @@ -55,7 +55,7 @@ impl Command { /// Execute `db list` command pub fn execute>( self, - tool: &DbTool>>, + tool: &DbTool>, ) -> eyre::Result<()> { self.table.view(&ListTableViewer { tool, args: &self }) } @@ -89,7 +89,7 @@ impl Command { } struct ListTableViewer<'a, N: NodeTypes> { - tool: &'a DbTool>>, + tool: &'a DbTool>, args: &'a Command, } diff --git a/crates/cli/commands/src/db/stats.rs b/crates/cli/commands/src/db/stats.rs index 85edbeeb4e..9551fffb4d 100644 --- a/crates/cli/commands/src/db/stats.rs +++ b/crates/cli/commands/src/db/stats.rs @@ -16,7 +16,7 @@ use reth_provider::{ RocksDBProviderFactory, }; use reth_static_file_types::SegmentRangeInclusive; -use std::{sync::Arc, time::Duration}; +use std::time::Duration; #[derive(Parser, Debug)] /// The arguments for the `reth db stats` command @@ -48,7 +48,7 @@ impl Command { pub fn execute>( self, data_dir: ChainPath, - tool: &DbTool>>, + tool: &DbTool>, ) -> eyre::Result<()> { if self.checksum { let checksum_report = self.checksum_report(tool)?; @@ -72,7 +72,7 @@ impl Command { Ok(()) } - fn db_stats_table>>( + fn db_stats_table>( &self, tool: &DbTool, ) -> eyre::Result { diff --git a/crates/cli/commands/src/launcher.rs b/crates/cli/commands/src/launcher.rs index d782334546..8f8984bcbc 100644 --- a/crates/cli/commands/src/launcher.rs +++ b/crates/cli/commands/src/launcher.rs @@ -2,7 +2,7 @@ use futures::Future; use reth_cli::chainspec::ChainSpecParser; use reth_db::DatabaseEnv; use reth_node_builder::{NodeBuilder, WithLaunchContext}; -use std::{fmt, sync::Arc}; +use std::fmt; /// A trait for launching a reth node with custom configuration strategies. /// @@ -30,7 +30,7 @@ where /// * `builder_args` - Extension arguments for configuration fn entrypoint( self, - builder: WithLaunchContext, C::ChainSpec>>, + builder: WithLaunchContext>, builder_args: Ext, ) -> impl Future>; } @@ -58,7 +58,7 @@ impl FnLauncher { where C: ChainSpecParser, F: AsyncFnOnce( - WithLaunchContext, C::ChainSpec>>, + WithLaunchContext>, Ext, ) -> eyre::Result<()>, { @@ -77,13 +77,13 @@ where C: ChainSpecParser, Ext: clap::Args + fmt::Debug, F: AsyncFnOnce( - WithLaunchContext, C::ChainSpec>>, + WithLaunchContext>, Ext, ) -> eyre::Result<()>, { fn entrypoint( self, - builder: WithLaunchContext, C::ChainSpec>>, + builder: WithLaunchContext>, builder_args: Ext, ) -> impl Future> { (self.func)(builder, builder_args) diff --git a/crates/cli/commands/src/node.rs b/crates/cli/commands/src/node.rs index a0d729499d..f59a52b2e6 100644 --- a/crates/cli/commands/src/node.rs +++ b/crates/cli/commands/src/node.rs @@ -206,7 +206,7 @@ where let db_path = data_dir.db(); tracing::info!(target: "reth::cli", path = ?db_path, "Opening database"); - let database = Arc::new(init_db(db_path.clone(), self.db.database_args())?.with_metrics()); + let database = init_db(db_path.clone(), self.db.database_args())?.with_metrics(); if with_unused_ports { node_config = node_config.with_unused_ports(); diff --git a/crates/cli/commands/src/stage/dump/execution.rs b/crates/cli/commands/src/stage/dump/execution.rs index 14d07ec3cc..9bb9da1d5b 100644 --- a/crates/cli/commands/src/stage/dump/execution.rs +++ b/crates/cli/commands/src/stage/dump/execution.rs @@ -26,7 +26,7 @@ pub(crate) async fn dump_execution_stage( consensus: C, ) -> eyre::Result<()> where - N: ProviderNodeTypes>, + N: ProviderNodeTypes, E: ConfigureEvm + 'static, C: FullConsensus + 'static, { @@ -39,7 +39,7 @@ where if should_run { dry_run( ProviderFactory::::new( - Arc::new(output_db), + output_db, db_tool.chain(), StaticFileProvider::read_write(output_datadir.static_files())?, RocksDBProvider::builder(output_datadir.rocksdb()).build()?, diff --git a/crates/cli/commands/src/stage/dump/hashing_account.rs b/crates/cli/commands/src/stage/dump/hashing_account.rs index ecd138ece3..cc3ffac38d 100644 --- a/crates/cli/commands/src/stage/dump/hashing_account.rs +++ b/crates/cli/commands/src/stage/dump/hashing_account.rs @@ -10,10 +10,9 @@ use reth_provider::{ DatabaseProviderFactory, ProviderFactory, }; use reth_stages::{stages::AccountHashingStage, Stage, StageCheckpoint, UnwindInput}; -use std::sync::Arc; use tracing::info; -pub(crate) async fn dump_hashing_account_stage>>( +pub(crate) async fn dump_hashing_account_stage>( db_tool: &DbTool, from: BlockNumber, to: BlockNumber, @@ -36,7 +35,7 @@ pub(crate) async fn dump_hashing_account_stage::new( - Arc::new(output_db), + output_db, db_tool.chain(), StaticFileProvider::read_write(output_datadir.static_files())?, RocksDBProvider::builder(output_datadir.rocksdb()).build()?, diff --git a/crates/cli/commands/src/stage/dump/hashing_storage.rs b/crates/cli/commands/src/stage/dump/hashing_storage.rs index f9ee242bf4..5d19bb1d26 100644 --- a/crates/cli/commands/src/stage/dump/hashing_storage.rs +++ b/crates/cli/commands/src/stage/dump/hashing_storage.rs @@ -9,10 +9,9 @@ use reth_provider::{ DatabaseProviderFactory, ProviderFactory, }; use reth_stages::{stages::StorageHashingStage, Stage, StageCheckpoint, UnwindInput}; -use std::sync::Arc; use tracing::info; -pub(crate) async fn dump_hashing_storage_stage>>( +pub(crate) async fn dump_hashing_storage_stage>( db_tool: &DbTool, from: u64, to: u64, @@ -26,7 +25,7 @@ pub(crate) async fn dump_hashing_storage_stage::new( - Arc::new(output_db), + output_db, db_tool.chain(), StaticFileProvider::read_write(output_datadir.static_files())?, RocksDBProvider::builder(output_datadir.rocksdb()).build()?, diff --git a/crates/cli/commands/src/stage/dump/merkle.rs b/crates/cli/commands/src/stage/dump/merkle.rs index dab8f38cb5..4376134637 100644 --- a/crates/cli/commands/src/stage/dump/merkle.rs +++ b/crates/cli/commands/src/stage/dump/merkle.rs @@ -34,7 +34,7 @@ pub(crate) async fn dump_merkle_stage( consensus: impl FullConsensus + 'static, ) -> Result<()> where - N: ProviderNodeTypes>, + N: ProviderNodeTypes, { let (output_db, tip_block_number) = setup(from, to, &output_datadir.db(), db_tool)?; @@ -59,7 +59,7 @@ where if should_run { dry_run( ProviderFactory::::new( - Arc::new(output_db), + output_db, db_tool.chain(), StaticFileProvider::read_write(output_datadir.static_files())?, RocksDBProvider::builder(output_datadir.rocksdb()).build()?, diff --git a/crates/cli/commands/src/stage/unwind.rs b/crates/cli/commands/src/stage/unwind.rs index ffd8e33006..2ad83a32cf 100644 --- a/crates/cli/commands/src/stage/unwind.rs +++ b/crates/cli/commands/src/stage/unwind.rs @@ -158,7 +158,7 @@ enum Subcommands { impl Subcommands { /// Returns the block to unwind to. The returned block will stay in database. - fn unwind_target>>( + fn unwind_target>( &self, factory: ProviderFactory, ) -> eyre::Result { diff --git a/crates/e2e-test-utils/src/setup_import.rs b/crates/e2e-test-utils/src/setup_import.rs index d456bb37c9..00d321afb3 100644 --- a/crates/e2e-test-utils/src/setup_import.rs +++ b/crates/e2e-test-utils/src/setup_import.rs @@ -114,22 +114,22 @@ pub async fn setup_engine_with_chain_import( // Initialize the database using init_db (same as CLI import command) let db_args = reth_node_core::args::DatabaseArgs::default().database_args(); - let db_env = reth_db::init_db(&db_path, db_args)?; - let db = Arc::new(db_env); + let db = reth_db::init_db(&db_path, db_args)?; // Create a provider factory with the initialized database (use regular DB, not // TempDatabase) We need to specify the node types properly for the adapter - let provider_factory = ProviderFactory::< - NodeTypesWithDBAdapter>, - >::new( - db.clone(), - chain_spec.clone(), - reth_provider::providers::StaticFileProvider::read_write(static_files_path.clone())?, - reth_provider::providers::RocksDBProvider::builder(rocksdb_dir_path) - .with_default_tables() - .build() - .unwrap(), - )?; + let provider_factory = + ProviderFactory::>::new( + db.clone(), + chain_spec.clone(), + reth_provider::providers::StaticFileProvider::read_write( + static_files_path.clone(), + )?, + reth_provider::providers::RocksDBProvider::builder(rocksdb_dir_path) + .with_default_tables() + .build() + .unwrap(), + )?; // Initialize genesis if needed reth_db_common::init::init_genesis(&provider_factory)?; @@ -320,11 +320,10 @@ mod tests { // Import the chain { let db_args = reth_node_core::args::DatabaseArgs::default().database_args(); - let db_env = reth_db::init_db(&db_path, db_args).unwrap(); - let db = Arc::new(db_env); + let db = reth_db::init_db(&db_path, db_args).unwrap(); let provider_factory: ProviderFactory< - NodeTypesWithDBAdapter>, + NodeTypesWithDBAdapter, > = ProviderFactory::new( db.clone(), chain_spec.clone(), @@ -385,11 +384,10 @@ mod tests { // Now reopen the database and verify checkpoints are still there { - let db_env = reth_db::init_db(&db_path, DatabaseArguments::default()).unwrap(); - let db = Arc::new(db_env); + let db = reth_db::init_db(&db_path, DatabaseArguments::default()).unwrap(); let provider_factory: ProviderFactory< - NodeTypesWithDBAdapter>, + NodeTypesWithDBAdapter, > = ProviderFactory::new( db, chain_spec.clone(), diff --git a/crates/ethereum/cli/src/app.rs b/crates/ethereum/cli/src/app.rs index 33f272d097..2c08b57a80 100644 --- a/crates/ethereum/cli/src/app.rs +++ b/crates/ethereum/cli/src/app.rs @@ -86,7 +86,7 @@ where mut self, components: impl CliComponentsBuilder, launcher: impl AsyncFnOnce( - WithLaunchContext, C::ChainSpec>>, + WithLaunchContext>, Ext, ) -> Result<()>, ) -> Result<()> @@ -132,7 +132,7 @@ pub(crate) fn run_commands_with( runner: CliRunner, components: impl CliComponentsBuilder, launcher: impl AsyncFnOnce( - WithLaunchContext, C::ChainSpec>>, + WithLaunchContext>, Ext, ) -> Result<()>, ) -> Result<()> diff --git a/crates/ethereum/cli/src/interface.rs b/crates/ethereum/cli/src/interface.rs index 1f45bf7f53..4cfff2c62a 100644 --- a/crates/ethereum/cli/src/interface.rs +++ b/crates/ethereum/cli/src/interface.rs @@ -131,7 +131,7 @@ impl< /// ```` pub fn run(self, launcher: L) -> eyre::Result<()> where - L: FnOnce(WithLaunchContext, C::ChainSpec>>, Ext) -> Fut, + L: FnOnce(WithLaunchContext>, Ext) -> Fut, Fut: Future>, C: ChainSpecParser, { @@ -148,7 +148,7 @@ impl< self, components: impl CliComponentsBuilder, launcher: impl AsyncFnOnce( - WithLaunchContext, C::ChainSpec>>, + WithLaunchContext>, Ext, ) -> eyre::Result<()>, ) -> eyre::Result<()> @@ -180,7 +180,7 @@ impl< /// ``` pub fn with_runner(self, runner: CliRunner, launcher: L) -> eyre::Result<()> where - L: FnOnce(WithLaunchContext, C::ChainSpec>>, Ext) -> Fut, + L: FnOnce(WithLaunchContext>, Ext) -> Fut, Fut: Future>, C: ChainSpecParser, { @@ -196,7 +196,7 @@ impl< runner: CliRunner, components: impl CliComponentsBuilder, launcher: impl AsyncFnOnce( - WithLaunchContext, C::ChainSpec>>, + WithLaunchContext>, Ext, ) -> eyre::Result<()>, ) -> eyre::Result<()> diff --git a/crates/ethereum/node/src/node.rs b/crates/ethereum/node/src/node.rs index 2a645ad274..19d0792947 100644 --- a/crates/ethereum/node/src/node.rs +++ b/crates/ethereum/node/src/node.rs @@ -119,10 +119,9 @@ impl EthereumNode { /// use reth_db::open_db_read_only; /// use reth_node_ethereum::EthereumNode; /// use reth_provider::providers::{RocksDBProvider, StaticFileProvider}; - /// use std::sync::Arc; /// /// let factory = EthereumNode::provider_factory_builder() - /// .db(Arc::new(open_db_read_only("db", Default::default()).unwrap())) + /// .db(open_db_read_only("db", Default::default()).unwrap()) /// .chainspec(ChainSpecBuilder::mainnet().build().into()) /// .static_file(StaticFileProvider::read_only("db/static_files", false).unwrap()) /// .rocksdb_provider(RocksDBProvider::builder("db/rocksdb").build().unwrap()) diff --git a/crates/node/builder/src/node.rs b/crates/node/builder/src/node.rs index 1cc50c4ba6..8019e8ab1c 100644 --- a/crates/node/builder/src/node.rs +++ b/crates/node/builder/src/node.rs @@ -218,9 +218,9 @@ impl> DerefMut for FullNode> = +pub type FullNodeFor = FullNode>, >>::AddOns>; /// Helper type alias to define [`NodeHandle`] for a given [`Node`]. -pub type NodeHandleFor> = +pub type NodeHandleFor = NodeHandle>, >>::AddOns>; diff --git a/crates/optimism/cli/src/lib.rs b/crates/optimism/cli/src/lib.rs index 52fdcc2ddd..26884090fd 100644 --- a/crates/optimism/cli/src/lib.rs +++ b/crates/optimism/cli/src/lib.rs @@ -37,7 +37,7 @@ pub use commands::{import::ImportOpCommand, import_receipts::ImportReceiptsOpCom use reth_optimism_chainspec::OpChainSpec; use reth_rpc_server_types::{DefaultRpcModuleValidator, RpcModuleValidator}; -use std::{ffi::OsString, fmt, marker::PhantomData, sync::Arc}; +use std::{ffi::OsString, fmt, marker::PhantomData}; use chainspec::OpChainSpecParser; use clap::Parser; @@ -121,7 +121,7 @@ where /// [`NodeCommand`](reth_cli_commands::node::NodeCommand). pub fn run(self, launcher: L) -> eyre::Result<()> where - L: FnOnce(WithLaunchContext, C::ChainSpec>>, Ext) -> Fut, + L: FnOnce(WithLaunchContext>, Ext) -> Fut, Fut: Future>, { self.with_runner(CliRunner::try_default_runtime()?, launcher) @@ -130,7 +130,7 @@ where /// Execute the configured cli command with the provided [`CliRunner`]. pub fn with_runner(self, runner: CliRunner, launcher: L) -> eyre::Result<()> where - L: FnOnce(WithLaunchContext, C::ChainSpec>>, Ext) -> Fut, + L: FnOnce(WithLaunchContext>, Ext) -> Fut, Fut: Future>, { let mut this = self.configure(); diff --git a/crates/optimism/node/src/node.rs b/crates/optimism/node/src/node.rs index 51d0ff3022..7247ad71f7 100644 --- a/crates/optimism/node/src/node.rs +++ b/crates/optimism/node/src/node.rs @@ -219,10 +219,9 @@ impl OpNode { /// use reth_optimism_chainspec::OpChainSpecBuilder; /// use reth_optimism_node::OpNode; /// use reth_provider::providers::{RocksDBProvider, StaticFileProvider}; - /// use std::sync::Arc; /// /// let factory = OpNode::provider_factory_builder() - /// .db(Arc::new(open_db_read_only("db", Default::default()).unwrap())) + /// .db(open_db_read_only("db", Default::default()).unwrap()) /// .chainspec(OpChainSpecBuilder::base_mainnet().build().into()) /// .static_file(StaticFileProvider::read_only("db/static_files", false).unwrap()) /// .rocksdb_provider(RocksDBProvider::builder("db/rocksdb").build().unwrap()) diff --git a/crates/storage/db-common/src/init.rs b/crates/storage/db-common/src/init.rs index 407d977af9..f13272a44a 100644 --- a/crates/storage/db-common/src/init.rs +++ b/crates/storage/db-common/src/init.rs @@ -960,8 +960,8 @@ mod tests { let provider = factory.provider().unwrap(); let tx = provider.tx_ref(); ( - collect_table_entries::, tables::AccountsHistory>(tx).unwrap(), - collect_table_entries::, tables::StoragesHistory>(tx).unwrap(), + collect_table_entries::(tx).unwrap(), + collect_table_entries::(tx).unwrap(), ) }; diff --git a/crates/storage/db/src/implementation/mdbx/cursor.rs b/crates/storage/db/src/implementation/mdbx/cursor.rs index 90fc5c535c..a8f71b40c7 100644 --- a/crates/storage/db/src/implementation/mdbx/cursor.rs +++ b/crates/storage/db/src/implementation/mdbx/cursor.rs @@ -374,10 +374,9 @@ mod tests { transaction::{DbTx, DbTxMut}, }; use reth_primitives_traits::StorageEntry; - use std::sync::Arc; use tempfile::TempDir; - fn create_test_db() -> Arc { + fn create_test_db() -> DatabaseEnv { let path = TempDir::new().unwrap(); let mut db = DatabaseEnv::open( path.path(), @@ -386,7 +385,7 @@ mod tests { ) .unwrap(); db.create_tables().unwrap(); - Arc::new(db) + db } #[test] diff --git a/crates/storage/db/src/implementation/mdbx/mod.rs b/crates/storage/db/src/implementation/mdbx/mod.rs index 8a95115eee..f0d46b2c9b 100644 --- a/crates/storage/db/src/implementation/mdbx/mod.rs +++ b/crates/storage/db/src/implementation/mdbx/mod.rs @@ -222,7 +222,7 @@ impl DatabaseArguments { } /// Wrapper for the libmdbx environment: [Environment] -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct DatabaseEnv { /// Libmdbx-sys environment. inner: Environment, @@ -644,11 +644,8 @@ mod tests { use tempfile::TempDir; /// Create database for testing - fn create_test_db(kind: DatabaseEnvKind) -> Arc { - Arc::new(create_test_db_with_path( - kind, - &tempfile::TempDir::new().expect(ERROR_TEMPDIR).keep(), - )) + fn create_test_db(kind: DatabaseEnvKind) -> DatabaseEnv { + create_test_db_with_path(kind, &tempfile::TempDir::new().expect(ERROR_TEMPDIR).keep()) } /// Create database for testing with specified path @@ -737,7 +734,7 @@ mod tests { #[test] fn db_dup_cursor_delete_first() { - let db: Arc = create_test_db(DatabaseEnvKind::RW); + let db: DatabaseEnv = create_test_db(DatabaseEnvKind::RW); let tx = db.tx_mut().expect(ERROR_INIT_TX); let mut dup_cursor = tx.cursor_dup_write::().unwrap(); @@ -802,7 +799,7 @@ mod tests { #[test] fn db_cursor_walk_range() { - let db: Arc = create_test_db(DatabaseEnvKind::RW); + let db: DatabaseEnv = create_test_db(DatabaseEnvKind::RW); // PUT (0, 0), (1, 0), (2, 0), (3, 0) let tx = db.tx_mut().expect(ERROR_INIT_TX); @@ -866,7 +863,7 @@ mod tests { #[test] fn db_cursor_walk_range_on_dup_table() { - let db: Arc = create_test_db(DatabaseEnvKind::RW); + let db: DatabaseEnv = create_test_db(DatabaseEnvKind::RW); let address0 = Address::ZERO; let address1 = Address::with_last_byte(1); @@ -926,7 +923,7 @@ mod tests { #[expect(clippy::reversed_empty_ranges)] #[test] fn db_cursor_walk_range_invalid() { - let db: Arc = create_test_db(DatabaseEnvKind::RW); + let db: DatabaseEnv = create_test_db(DatabaseEnvKind::RW); // PUT (0, 0), (1, 0), (2, 0), (3, 0) let tx = db.tx_mut().expect(ERROR_INIT_TX); @@ -954,7 +951,7 @@ mod tests { #[test] fn db_walker() { - let db: Arc = create_test_db(DatabaseEnvKind::RW); + let db: DatabaseEnv = create_test_db(DatabaseEnvKind::RW); // PUT (0, 0), (1, 0), (3, 0) let tx = db.tx_mut().expect(ERROR_INIT_TX); @@ -984,7 +981,7 @@ mod tests { #[test] fn db_reverse_walker() { - let db: Arc = create_test_db(DatabaseEnvKind::RW); + let db: DatabaseEnv = create_test_db(DatabaseEnvKind::RW); // PUT (0, 0), (1, 0), (3, 0) let tx = db.tx_mut().expect(ERROR_INIT_TX); @@ -1014,7 +1011,7 @@ mod tests { #[test] fn db_walk_back() { - let db: Arc = create_test_db(DatabaseEnvKind::RW); + let db: DatabaseEnv = create_test_db(DatabaseEnvKind::RW); // PUT (0, 0), (1, 0), (3, 0) let tx = db.tx_mut().expect(ERROR_INIT_TX); @@ -1053,7 +1050,7 @@ mod tests { #[test] fn db_cursor_seek_exact_or_previous_key() { - let db: Arc = create_test_db(DatabaseEnvKind::RW); + let db: DatabaseEnv = create_test_db(DatabaseEnvKind::RW); // PUT let tx = db.tx_mut().expect(ERROR_INIT_TX); @@ -1077,7 +1074,7 @@ mod tests { #[test] fn db_cursor_insert() { - let db: Arc = create_test_db(DatabaseEnvKind::RW); + let db: DatabaseEnv = create_test_db(DatabaseEnvKind::RW); // PUT let tx = db.tx_mut().expect(ERROR_INIT_TX); @@ -1117,7 +1114,7 @@ mod tests { #[test] fn db_cursor_insert_dup() { - let db: Arc = create_test_db(DatabaseEnvKind::RW); + let db: DatabaseEnv = create_test_db(DatabaseEnvKind::RW); let tx = db.tx_mut().expect(ERROR_INIT_TX); let mut dup_cursor = tx.cursor_dup_write::().unwrap(); @@ -1135,7 +1132,7 @@ mod tests { #[test] fn db_cursor_delete_current_non_existent() { - let db: Arc = create_test_db(DatabaseEnvKind::RW); + let db: DatabaseEnv = create_test_db(DatabaseEnvKind::RW); let tx = db.tx_mut().expect(ERROR_INIT_TX); let key1 = Address::with_last_byte(1); @@ -1165,7 +1162,7 @@ mod tests { #[test] fn db_cursor_insert_wherever_cursor_is() { - let db: Arc = create_test_db(DatabaseEnvKind::RW); + let db: DatabaseEnv = create_test_db(DatabaseEnvKind::RW); let tx = db.tx_mut().expect(ERROR_INIT_TX); // PUT @@ -1198,7 +1195,7 @@ mod tests { #[test] fn db_cursor_append() { - let db: Arc = create_test_db(DatabaseEnvKind::RW); + let db: DatabaseEnv = create_test_db(DatabaseEnvKind::RW); // PUT let tx = db.tx_mut().expect(ERROR_INIT_TX); @@ -1225,7 +1222,7 @@ mod tests { #[test] fn db_cursor_append_failure() { - let db: Arc = create_test_db(DatabaseEnvKind::RW); + let db: DatabaseEnv = create_test_db(DatabaseEnvKind::RW); // PUT let tx = db.tx_mut().expect(ERROR_INIT_TX); @@ -1260,7 +1257,7 @@ mod tests { #[test] fn db_cursor_upsert() { - let db: Arc = create_test_db(DatabaseEnvKind::RW); + let db: DatabaseEnv = create_test_db(DatabaseEnvKind::RW); let tx = db.tx_mut().expect(ERROR_INIT_TX); let mut cursor = tx.cursor_write::().unwrap(); @@ -1295,7 +1292,7 @@ mod tests { #[test] fn db_cursor_dupsort_append() { - let db: Arc = create_test_db(DatabaseEnvKind::RW); + let db: DatabaseEnv = create_test_db(DatabaseEnvKind::RW); let transition_id = 2; @@ -1557,7 +1554,7 @@ mod tests { #[test] fn db_sharded_key() { - let db: Arc = create_test_db(DatabaseEnvKind::RW); + let db: DatabaseEnv = create_test_db(DatabaseEnvKind::RW); let real_key = address!("0xa2c122be93b0074270ebee7f6b7292c7deb45047"); let shards = 5; diff --git a/crates/storage/provider/src/providers/database/builder.rs b/crates/storage/provider/src/providers/database/builder.rs index 8c4816bb6e..9403754fea 100644 --- a/crates/storage/provider/src/providers/database/builder.rs +++ b/crates/storage/provider/src/providers/database/builder.rs @@ -100,13 +100,13 @@ impl ProviderFactoryBuilder { self, chainspec: Arc, config: impl Into, - ) -> eyre::Result>>> + ) -> eyre::Result>> where N: NodeTypesForProvider, { let ReadOnlyConfig { db_dir, db_args, static_files_dir, rocksdb_dir, watch_static_files } = config.into(); - self.db(Arc::new(open_db_read_only(db_dir, db_args)?)) + self.db(open_db_read_only(db_dir, db_args)?) .chainspec(chainspec) .static_file(StaticFileProvider::read_only(static_files_dir, watch_static_files)?) .rocksdb_provider(RocksDBProvider::builder(&rocksdb_dir).with_default_tables().build()?) diff --git a/crates/storage/provider/src/providers/database/mod.rs b/crates/storage/provider/src/providers/database/mod.rs index b9f7f1ccdd..455478325c 100644 --- a/crates/storage/provider/src/providers/database/mod.rs +++ b/crates/storage/provider/src/providers/database/mod.rs @@ -81,7 +81,7 @@ pub struct ProviderFactory { changeset_cache: ChangesetCache, } -impl ProviderFactory>> { +impl ProviderFactory> { /// Instantiates the builder for this type pub fn builder() -> ProviderFactoryBuilder { ProviderFactoryBuilder::default() @@ -178,7 +178,7 @@ impl RocksDBProviderFactory for ProviderFactory { } } -impl>> ProviderFactory { +impl> ProviderFactory { /// Create new database provider by passing a path. [`ProviderFactory`] will own the database /// instance. pub fn new_with_database_path>( @@ -189,7 +189,7 @@ impl>> ProviderFactory { rocksdb_provider: RocksDBProvider, ) -> RethResult { Self::new( - Arc::new(init_db(path, args).map_err(RethError::msg)?), + init_db(path, args).map_err(RethError::msg)?, chain_spec, static_file_provider, rocksdb_provider, diff --git a/crates/storage/provider/src/test_utils/mod.rs b/crates/storage/provider/src/test_utils/mod.rs index ae6f216ea4..b5d16d093b 100644 --- a/crates/storage/provider/src/test_utils/mod.rs +++ b/crates/storage/provider/src/test_utils/mod.rs @@ -36,8 +36,8 @@ pub type MockNodeTypes = reth_node_types::AnyNodeTypesWithEngine< >; /// Mock [`reth_node_types::NodeTypesWithDB`] for testing. -pub type MockNodeTypesWithDB> = - NodeTypesWithDBAdapter>; +pub type MockNodeTypesWithDB>> = + NodeTypesWithDBAdapter; /// Creates test provider factory with mainnet chain spec. pub fn create_test_provider_factory() -> ProviderFactory { diff --git a/examples/rpc-db/src/main.rs b/examples/rpc-db/src/main.rs index 4a0339fd00..1d3e159c28 100644 --- a/examples/rpc-db/src/main.rs +++ b/examples/rpc-db/src/main.rs @@ -44,12 +44,12 @@ async fn main() -> eyre::Result<()> { // 1. Set up the DB let db_path = std::env::var("RETH_DB_PATH")?; let db_path = Path::new(&db_path); - let db = Arc::new(open_db_read_only( + let db = open_db_read_only( db_path.join("db").as_path(), DatabaseArguments::new(ClientVersion::default()), - )?); + )?; let spec = Arc::new(ChainSpecBuilder::mainnet().build()); - let factory = ProviderFactory::>>::new( + let factory = ProviderFactory::>::new( db.clone(), spec.clone(), StaticFileProvider::read_only(db_path.join("static_files"), true)?,