diff --git a/crates/cli/commands/src/stage/drop.rs b/crates/cli/commands/src/stage/drop.rs index c1f43fef89..e4993be171 100644 --- a/crates/cli/commands/src/stage/drop.rs +++ b/crates/cli/commands/src/stage/drop.rs @@ -9,7 +9,10 @@ use reth_db_api::{ transaction::{DbTx, DbTxMut}, }; use reth_db_common::{ - init::{insert_genesis_header, insert_genesis_history, insert_genesis_state}, + init::{ + insert_genesis_account_history, insert_genesis_header, insert_genesis_state, + insert_genesis_storage_history, + }, DbTool, }; use reth_node_api::{HeaderTy, ReceiptTy, TxTy}; @@ -171,7 +174,7 @@ impl Command { None, )?; } - StageEnum::AccountHistory | StageEnum::StorageHistory => { + StageEnum::AccountHistory => { let settings = provider_rw.cached_storage_settings(); let rocksdb = tool.provider_factory.rocksdb_provider(); @@ -181,16 +184,29 @@ impl Command { tx.clear::()?; } + reset_stage_checkpoint(tx, StageId::IndexAccountHistory)?; + + insert_genesis_account_history( + &provider_rw, + self.env.chain.genesis().alloc.iter(), + )?; + } + StageEnum::StorageHistory => { + let settings = provider_rw.cached_storage_settings(); + let rocksdb = tool.provider_factory.rocksdb_provider(); + if settings.storages_history_in_rocksdb { rocksdb.clear::()?; } else { tx.clear::()?; } - reset_stage_checkpoint(tx, StageId::IndexAccountHistory)?; reset_stage_checkpoint(tx, StageId::IndexStorageHistory)?; - insert_genesis_history(&provider_rw, self.env.chain.genesis().alloc.iter())?; + insert_genesis_storage_history( + &provider_rw, + self.env.chain.genesis().alloc.iter(), + )?; } StageEnum::TxLookup => { if provider_rw.cached_storage_settings().transaction_hash_numbers_in_rocksdb { diff --git a/crates/storage/db-common/src/init.rs b/crates/storage/db-common/src/init.rs index fa28eb35ed..fb2e87e452 100644 --- a/crates/storage/db-common/src/init.rs +++ b/crates/storage/db-common/src/init.rs @@ -429,6 +429,40 @@ where insert_history(provider, alloc, genesis_block_number) } +/// Inserts account history indices for genesis accounts. +pub fn insert_genesis_account_history<'a, 'b, Provider>( + provider: &Provider, + alloc: impl Iterator, +) -> ProviderResult<()> +where + Provider: DBProvider + + HistoryWriter + + ChainSpecProvider + + StorageSettingsCache + + RocksDBProviderFactory + + NodePrimitivesProvider, +{ + let genesis_block_number = provider.chain_spec().genesis_header().number(); + insert_account_history(provider, alloc, genesis_block_number) +} + +/// Inserts storage history indices for genesis accounts. +pub fn insert_genesis_storage_history<'a, 'b, Provider>( + provider: &Provider, + alloc: impl Iterator, +) -> ProviderResult<()> +where + Provider: DBProvider + + HistoryWriter + + ChainSpecProvider + + StorageSettingsCache + + RocksDBProviderFactory + + NodePrimitivesProvider, +{ + let genesis_block_number = provider.chain_spec().genesis_header().number(); + insert_storage_history(provider, alloc, genesis_block_number) +} + /// Inserts history indices for genesis accounts and storage. /// /// Writes to either MDBX or `RocksDB` based on storage settings configuration, @@ -438,6 +472,24 @@ pub fn insert_history<'a, 'b, Provider>( alloc: impl Iterator + Clone, block: u64, ) -> ProviderResult<()> +where + Provider: DBProvider + + HistoryWriter + + StorageSettingsCache + + RocksDBProviderFactory + + NodePrimitivesProvider, +{ + insert_account_history(provider, alloc.clone(), block)?; + insert_storage_history(provider, alloc, block)?; + Ok(()) +} + +/// Inserts account history indices at the given block. +pub fn insert_account_history<'a, 'b, Provider>( + provider: &Provider, + alloc: impl Iterator, + block: u64, +) -> ProviderResult<()> where Provider: DBProvider + HistoryWriter @@ -448,13 +500,29 @@ where provider.with_rocksdb_batch(|batch| { let mut writer = EitherWriter::new_accounts_history(provider, batch)?; let list = BlockNumberList::new([block]).expect("single block always fits"); - for (addr, _) in alloc.clone() { + for (addr, _) in alloc { writer.upsert_account_history(ShardedKey::last(*addr), &list)?; } trace!(target: "reth::cli", "Inserted account history"); Ok(((), writer.into_raw_rocksdb_batch())) })?; + Ok(()) +} + +/// Inserts storage history indices at the given block. +pub fn insert_storage_history<'a, 'b, Provider>( + provider: &Provider, + alloc: impl Iterator, + block: u64, +) -> ProviderResult<()> +where + Provider: DBProvider + + HistoryWriter + + StorageSettingsCache + + RocksDBProviderFactory + + NodePrimitivesProvider, +{ provider.with_rocksdb_batch(|batch| { let mut writer = EitherWriter::new_storages_history(provider, batch)?; let list = BlockNumberList::new([block]).expect("single block always fits");