diff --git a/crates/cli/commands/src/common.rs b/crates/cli/commands/src/common.rs index 3236c3dd9ca..f7324efde41 100644 --- a/crates/cli/commands/src/common.rs +++ b/crates/cli/commands/src/common.rs @@ -150,16 +150,22 @@ impl EnvironmentArgs { // commands can proceed. debug!(target: "reth::cli", ?rocksdb_path, "RocksDB not found, initializing empty database"); reth_fs_util::create_dir_all(&rocksdb_path)?; - RocksDBProvider::builder(data_dir.rocksdb()) + let mut builder = RocksDBProvider::builder(data_dir.rocksdb()) .with_default_tables() - .with_database_log_level(self.db.log_level) - .build()? + .with_database_log_level(self.db.log_level); + if let Some(cache_size) = self.db.rocksdb_block_cache_size { + builder = builder.with_block_cache_size(cache_size); + } + builder.build()? } else { - RocksDBProvider::builder(data_dir.rocksdb()) + let mut builder = RocksDBProvider::builder(data_dir.rocksdb()) .with_default_tables() .with_database_log_level(self.db.log_level) - .with_read_only(!access.is_read_write()) - .build()? + .with_read_only(!access.is_read_write()); + if let Some(cache_size) = self.db.rocksdb_block_cache_size { + builder = builder.with_block_cache_size(cache_size); + } + builder.build()? }; let provider_factory = diff --git a/crates/cli/commands/src/re_execute.rs b/crates/cli/commands/src/re_execute.rs index bcc232fd284..de13e341e03 100644 --- a/crates/cli/commands/src/re_execute.rs +++ b/crates/cli/commands/src/re_execute.rs @@ -19,7 +19,7 @@ use reth_provider::{ }; use reth_revm::database::StateProviderDatabase; use reth_stages::stages::calculate_gas_used_from_headers; -use reth_storage_api::{DBProvider, TryIntoHistoricalStateProvider}; +use reth_storage_api::DBProvider; use std::{ sync::{ atomic::{AtomicU64, Ordering}, @@ -69,13 +69,18 @@ impl Command { impl> Command { /// Execute `re-execute` command pub async fn execute( - self, + mut self, components: impl CliComponentsBuilder, runtime: reth_tasks::Runtime, ) -> eyre::Result<()> where N: CliNodeTypes, { + // Default to 4GB RocksDB block cache for re-execute unless explicitly set. + if self.env.db.rocksdb_block_cache_size.is_none() { + self.env.db.rocksdb_block_cache_size = Some(4 << 30); + } + let Environment { provider_factory, .. } = self.env.init::(AccessRights::RO, runtime)?; let components = components(provider_factory.chain_spec()); @@ -109,20 +114,6 @@ impl min_block..=max_block, )?; - let db_at = { - let provider_factory = provider_factory.clone(); - move |block_number: u64| { - StateProviderDatabase( - provider_factory - .provider() - .unwrap() - .disable_long_read_transaction_safety() - .try_into_history_at_block(block_number) - .unwrap(), - ) - } - }; - let skip_invalid_blocks = self.skip_invalid_blocks; let blocks_per_chunk = self.blocks_per_chunk; let (stats_tx, mut stats_rx) = mpsc::unbounded_channel(); @@ -138,13 +129,23 @@ impl let provider_factory = provider_factory.clone(); let evm_config = components.evm_config().clone(); let consensus = components.consensus().clone(); - let db_at = db_at.clone(); let stats_tx = stats_tx.clone(); let info_tx = info_tx.clone(); let cancellation = cancellation.clone(); let next_block = Arc::clone(&next_block); tasks.spawn_blocking(move || { let executor_lifetime = Duration::from_secs(600); + let provider = provider_factory.database_provider_ro()?.disable_long_read_transaction_safety(); + + let db_at = { + |block_number: u64| { + StateProviderDatabase( + provider + .history_by_block_number(block_number) + .unwrap(), + ) + } + }; loop { if cancellation.is_cancelled() { diff --git a/crates/node/core/src/args/database.rs b/crates/node/core/src/args/database.rs index 298669e1985..81a6aeea6da 100644 --- a/crates/node/core/src/args/database.rs +++ b/crates/node/core/src/args/database.rs @@ -60,6 +60,13 @@ pub struct DatabaseArgs { value_parser = value_parser!(SyncMode), )] pub sync_mode: Option, + /// `RocksDB` block cache size (e.g., 512MB, 4GB). + /// + /// Controls the size of the in-memory LRU cache for decompressed `RocksDB` blocks. + /// A larger cache reduces repeated decompression of hot blocks, improving read + /// performance for history lookups. + #[arg(long = "db.rocksdb-block-cache-size", value_parser = parse_byte_size)] + pub rocksdb_block_cache_size: Option, } impl DatabaseArgs { diff --git a/crates/storage/provider/src/providers/database/provider.rs b/crates/storage/provider/src/providers/database/provider.rs index 5991beaf73f..4eca1f0d523 100644 --- a/crates/storage/provider/src/providers/database/provider.rs +++ b/crates/storage/provider/src/providers/database/provider.rs @@ -300,8 +300,16 @@ impl DatabaseProvider { &'a self, block_hash: BlockHash, ) -> ProviderResult> { - let mut block_number = + let block_number = self.block_number(block_hash)?.ok_or(ProviderError::BlockHashNotFound(block_hash))?; + self.history_by_block_number(block_number) + } + + /// Storage provider for state at that given block number + pub fn history_by_block_number<'a>( + &'a self, + mut block_number: BlockNumber, + ) -> ProviderResult> { if block_number == self.best_block_number().unwrap_or_default() && block_number == self.last_block_number().unwrap_or_default() { diff --git a/docs/vocs/docs/pages/cli/reth/db.mdx b/docs/vocs/docs/pages/cli/reth/db.mdx index 5996e58597f..7b558671a3b 100644 --- a/docs/vocs/docs/pages/cli/reth/db.mdx +++ b/docs/vocs/docs/pages/cli/reth/db.mdx @@ -113,6 +113,11 @@ Database: --db.sync-mode Controls how aggressively the database synchronizes data to disk + --db.rocksdb-block-cache-size + `RocksDB` block cache size (e.g., 512MB, 4GB). + + Controls the size of the in-memory LRU cache for decompressed `RocksDB` blocks. A larger cache reduces repeated decompression of hot blocks, improving read performance for history lookups. + Static Files: --static-files.blocks-per-file.headers Number of blocks per file for the headers segment diff --git a/docs/vocs/docs/pages/cli/reth/db/diff.mdx b/docs/vocs/docs/pages/cli/reth/db/diff.mdx index 1ba15744018..d4fb7527d98 100644 --- a/docs/vocs/docs/pages/cli/reth/db/diff.mdx +++ b/docs/vocs/docs/pages/cli/reth/db/diff.mdx @@ -62,6 +62,11 @@ Database: --db.sync-mode Controls how aggressively the database synchronizes data to disk + --db.rocksdb-block-cache-size + `RocksDB` block cache size (e.g., 512MB, 4GB). + + Controls the size of the in-memory LRU cache for decompressed `RocksDB` blocks. A larger cache reduces repeated decompression of hot blocks, improving read performance for history lookups. + --table The table name to diff. If not specified, all tables are diffed. diff --git a/docs/vocs/docs/pages/cli/reth/download.mdx b/docs/vocs/docs/pages/cli/reth/download.mdx index aa3f64fb8da..e56a3522220 100644 --- a/docs/vocs/docs/pages/cli/reth/download.mdx +++ b/docs/vocs/docs/pages/cli/reth/download.mdx @@ -92,6 +92,11 @@ Database: --db.sync-mode Controls how aggressively the database synchronizes data to disk + --db.rocksdb-block-cache-size + `RocksDB` block cache size (e.g., 512MB, 4GB). + + Controls the size of the in-memory LRU cache for decompressed `RocksDB` blocks. A larger cache reduces repeated decompression of hot blocks, improving read performance for history lookups. + Static Files: --static-files.blocks-per-file.headers Number of blocks per file for the headers segment diff --git a/docs/vocs/docs/pages/cli/reth/export-era.mdx b/docs/vocs/docs/pages/cli/reth/export-era.mdx index a6a365984b6..42ec8b264de 100644 --- a/docs/vocs/docs/pages/cli/reth/export-era.mdx +++ b/docs/vocs/docs/pages/cli/reth/export-era.mdx @@ -92,6 +92,11 @@ Database: --db.sync-mode Controls how aggressively the database synchronizes data to disk + --db.rocksdb-block-cache-size + `RocksDB` block cache size (e.g., 512MB, 4GB). + + Controls the size of the in-memory LRU cache for decompressed `RocksDB` blocks. A larger cache reduces repeated decompression of hot blocks, improving read performance for history lookups. + Static Files: --static-files.blocks-per-file.headers Number of blocks per file for the headers segment diff --git a/docs/vocs/docs/pages/cli/reth/import-era.mdx b/docs/vocs/docs/pages/cli/reth/import-era.mdx index aa229bfb5f9..ea23c981f10 100644 --- a/docs/vocs/docs/pages/cli/reth/import-era.mdx +++ b/docs/vocs/docs/pages/cli/reth/import-era.mdx @@ -92,6 +92,11 @@ Database: --db.sync-mode Controls how aggressively the database synchronizes data to disk + --db.rocksdb-block-cache-size + `RocksDB` block cache size (e.g., 512MB, 4GB). + + Controls the size of the in-memory LRU cache for decompressed `RocksDB` blocks. A larger cache reduces repeated decompression of hot blocks, improving read performance for history lookups. + Static Files: --static-files.blocks-per-file.headers Number of blocks per file for the headers segment diff --git a/docs/vocs/docs/pages/cli/reth/import.mdx b/docs/vocs/docs/pages/cli/reth/import.mdx index 735a3dcbf52..8428972c72b 100644 --- a/docs/vocs/docs/pages/cli/reth/import.mdx +++ b/docs/vocs/docs/pages/cli/reth/import.mdx @@ -92,6 +92,11 @@ Database: --db.sync-mode Controls how aggressively the database synchronizes data to disk + --db.rocksdb-block-cache-size + `RocksDB` block cache size (e.g., 512MB, 4GB). + + Controls the size of the in-memory LRU cache for decompressed `RocksDB` blocks. A larger cache reduces repeated decompression of hot blocks, improving read performance for history lookups. + Static Files: --static-files.blocks-per-file.headers Number of blocks per file for the headers segment diff --git a/docs/vocs/docs/pages/cli/reth/init-state.mdx b/docs/vocs/docs/pages/cli/reth/init-state.mdx index 54f84108930..47bc421214b 100644 --- a/docs/vocs/docs/pages/cli/reth/init-state.mdx +++ b/docs/vocs/docs/pages/cli/reth/init-state.mdx @@ -92,6 +92,11 @@ Database: --db.sync-mode Controls how aggressively the database synchronizes data to disk + --db.rocksdb-block-cache-size + `RocksDB` block cache size (e.g., 512MB, 4GB). + + Controls the size of the in-memory LRU cache for decompressed `RocksDB` blocks. A larger cache reduces repeated decompression of hot blocks, improving read performance for history lookups. + Static Files: --static-files.blocks-per-file.headers Number of blocks per file for the headers segment diff --git a/docs/vocs/docs/pages/cli/reth/init.mdx b/docs/vocs/docs/pages/cli/reth/init.mdx index 61438841fdf..657f56c4315 100644 --- a/docs/vocs/docs/pages/cli/reth/init.mdx +++ b/docs/vocs/docs/pages/cli/reth/init.mdx @@ -92,6 +92,11 @@ Database: --db.sync-mode Controls how aggressively the database synchronizes data to disk + --db.rocksdb-block-cache-size + `RocksDB` block cache size (e.g., 512MB, 4GB). + + Controls the size of the in-memory LRU cache for decompressed `RocksDB` blocks. A larger cache reduces repeated decompression of hot blocks, improving read performance for history lookups. + Static Files: --static-files.blocks-per-file.headers Number of blocks per file for the headers segment diff --git a/docs/vocs/docs/pages/cli/reth/node.mdx b/docs/vocs/docs/pages/cli/reth/node.mdx index 3688dddbf99..0e5618b3f38 100644 --- a/docs/vocs/docs/pages/cli/reth/node.mdx +++ b/docs/vocs/docs/pages/cli/reth/node.mdx @@ -821,6 +821,11 @@ Database: --db.sync-mode Controls how aggressively the database synchronizes data to disk + --db.rocksdb-block-cache-size + `RocksDB` block cache size (e.g., 512MB, 4GB). + + Controls the size of the in-memory LRU cache for decompressed `RocksDB` blocks. A larger cache reduces repeated decompression of hot blocks, improving read performance for history lookups. + Dev testnet: --dev Start the node in dev mode diff --git a/docs/vocs/docs/pages/cli/reth/prune.mdx b/docs/vocs/docs/pages/cli/reth/prune.mdx index 755ca0931e9..4e826ef2bc0 100644 --- a/docs/vocs/docs/pages/cli/reth/prune.mdx +++ b/docs/vocs/docs/pages/cli/reth/prune.mdx @@ -92,6 +92,11 @@ Database: --db.sync-mode Controls how aggressively the database synchronizes data to disk + --db.rocksdb-block-cache-size + `RocksDB` block cache size (e.g., 512MB, 4GB). + + Controls the size of the in-memory LRU cache for decompressed `RocksDB` blocks. A larger cache reduces repeated decompression of hot blocks, improving read performance for history lookups. + Static Files: --static-files.blocks-per-file.headers Number of blocks per file for the headers segment diff --git a/docs/vocs/docs/pages/cli/reth/re-execute.mdx b/docs/vocs/docs/pages/cli/reth/re-execute.mdx index 667e27d55b5..49951459d26 100644 --- a/docs/vocs/docs/pages/cli/reth/re-execute.mdx +++ b/docs/vocs/docs/pages/cli/reth/re-execute.mdx @@ -92,6 +92,11 @@ Database: --db.sync-mode Controls how aggressively the database synchronizes data to disk + --db.rocksdb-block-cache-size + `RocksDB` block cache size (e.g., 512MB, 4GB). + + Controls the size of the in-memory LRU cache for decompressed `RocksDB` blocks. A larger cache reduces repeated decompression of hot blocks, improving read performance for history lookups. + Static Files: --static-files.blocks-per-file.headers Number of blocks per file for the headers segment diff --git a/docs/vocs/docs/pages/cli/reth/stage/drop.mdx b/docs/vocs/docs/pages/cli/reth/stage/drop.mdx index a2374ed0e2e..77875555f69 100644 --- a/docs/vocs/docs/pages/cli/reth/stage/drop.mdx +++ b/docs/vocs/docs/pages/cli/reth/stage/drop.mdx @@ -92,6 +92,11 @@ Database: --db.sync-mode Controls how aggressively the database synchronizes data to disk + --db.rocksdb-block-cache-size + `RocksDB` block cache size (e.g., 512MB, 4GB). + + Controls the size of the in-memory LRU cache for decompressed `RocksDB` blocks. A larger cache reduces repeated decompression of hot blocks, improving read performance for history lookups. + Static Files: --static-files.blocks-per-file.headers Number of blocks per file for the headers segment diff --git a/docs/vocs/docs/pages/cli/reth/stage/dump.mdx b/docs/vocs/docs/pages/cli/reth/stage/dump.mdx index 2f0fcd7c89d..2cc718a1da2 100644 --- a/docs/vocs/docs/pages/cli/reth/stage/dump.mdx +++ b/docs/vocs/docs/pages/cli/reth/stage/dump.mdx @@ -99,6 +99,11 @@ Database: --db.sync-mode Controls how aggressively the database synchronizes data to disk + --db.rocksdb-block-cache-size + `RocksDB` block cache size (e.g., 512MB, 4GB). + + Controls the size of the in-memory LRU cache for decompressed `RocksDB` blocks. A larger cache reduces repeated decompression of hot blocks, improving read performance for history lookups. + Static Files: --static-files.blocks-per-file.headers Number of blocks per file for the headers segment diff --git a/docs/vocs/docs/pages/cli/reth/stage/run.mdx b/docs/vocs/docs/pages/cli/reth/stage/run.mdx index efc471e38d6..d8ab605cf7a 100644 --- a/docs/vocs/docs/pages/cli/reth/stage/run.mdx +++ b/docs/vocs/docs/pages/cli/reth/stage/run.mdx @@ -92,6 +92,11 @@ Database: --db.sync-mode Controls how aggressively the database synchronizes data to disk + --db.rocksdb-block-cache-size + `RocksDB` block cache size (e.g., 512MB, 4GB). + + Controls the size of the in-memory LRU cache for decompressed `RocksDB` blocks. A larger cache reduces repeated decompression of hot blocks, improving read performance for history lookups. + Static Files: --static-files.blocks-per-file.headers Number of blocks per file for the headers segment diff --git a/docs/vocs/docs/pages/cli/reth/stage/unwind.mdx b/docs/vocs/docs/pages/cli/reth/stage/unwind.mdx index cb7c70fc759..830766788e5 100644 --- a/docs/vocs/docs/pages/cli/reth/stage/unwind.mdx +++ b/docs/vocs/docs/pages/cli/reth/stage/unwind.mdx @@ -97,6 +97,11 @@ Database: --db.sync-mode Controls how aggressively the database synchronizes data to disk + --db.rocksdb-block-cache-size + `RocksDB` block cache size (e.g., 512MB, 4GB). + + Controls the size of the in-memory LRU cache for decompressed `RocksDB` blocks. A larger cache reduces repeated decompression of hot blocks, improving read performance for history lookups. + Static Files: --static-files.blocks-per-file.headers Number of blocks per file for the headers segment