From 247ce3c4e941ab986cb8d7180b517e1f0302ee60 Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Thu, 22 Jan 2026 08:40:10 -0800 Subject: [PATCH] feat(storage): warn storage settings diff at startup (#21320) Co-authored-by: YK --- crates/storage/db-common/src/init.rs | 51 ++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/crates/storage/db-common/src/init.rs b/crates/storage/db-common/src/init.rs index c82025970b..1af87fcb36 100644 --- a/crates/storage/db-common/src/init.rs +++ b/crates/storage/db-common/src/init.rs @@ -15,9 +15,10 @@ use reth_primitives_traits::{ use reth_provider::{ errors::provider::ProviderResult, providers::StaticFileWriter, BlockHashReader, BlockNumReader, BundleStateInit, ChainSpecProvider, DBProvider, DatabaseProviderFactory, ExecutionOutcome, - HashingWriter, HeaderProvider, HistoryWriter, MetadataWriter, OriginalValuesKnown, - ProviderError, RevertsInit, StageCheckpointReader, StageCheckpointWriter, StateWriteConfig, - StateWriter, StaticFileProviderFactory, StorageSettings, StorageSettingsCache, TrieWriter, + HashingWriter, HeaderProvider, HistoryWriter, MetadataProvider, MetadataWriter, + OriginalValuesKnown, ProviderError, RevertsInit, StageCheckpointReader, StageCheckpointWriter, + StateWriteConfig, StateWriter, StaticFileProviderFactory, StorageSettings, + StorageSettingsCache, TrieWriter, }; use reth_stages_types::{StageCheckpoint, StageId}; use reth_static_file_types::StaticFileSegment; @@ -28,7 +29,7 @@ use reth_trie::{ use reth_trie_db::DatabaseStateRoot; use serde::{Deserialize, Serialize}; use std::io::BufRead; -use tracing::{debug, error, info, trace}; +use tracing::{debug, error, info, trace, warn}; /// Default soft limit for number of bytes to read from state dump file, before inserting into /// database. @@ -90,7 +91,8 @@ where + StaticFileProviderFactory> + ChainSpecProvider + StageCheckpointReader - + BlockHashReader + + BlockNumReader + + MetadataProvider + StorageSettingsCache, PF::ProviderRW: StaticFileProviderFactory + StageCheckpointWriter @@ -124,7 +126,8 @@ where + StaticFileProviderFactory> + ChainSpecProvider + StageCheckpointReader - + BlockHashReader + + BlockNumReader + + MetadataProvider + StorageSettingsCache, PF::ProviderRW: StaticFileProviderFactory + StageCheckpointWriter @@ -159,6 +162,16 @@ where return Err(InitStorageError::UninitializedDatabase) } + let stored = factory.storage_settings()?.unwrap_or(StorageSettings::legacy()); + if stored != genesis_storage_settings { + warn!( + target: "reth::storage", + ?stored, + requested = ?genesis_storage_settings, + "Storage settings mismatch detected" + ); + } + debug!("Genesis already written, skipping."); return Ok(hash) } @@ -897,4 +910,30 @@ mod tests { )], ); } + + #[test] + fn warn_storage_settings_mismatch() { + let factory = create_test_provider_factory_with_chain_spec(MAINNET.clone()); + init_genesis_with_settings(&factory, StorageSettings::legacy()).unwrap(); + + // Request different settings - should warn but succeed + let result = init_genesis_with_settings( + &factory, + StorageSettings::legacy().with_receipts_in_static_files(true), + ); + + // Should succeed (warning is logged, not an error) + assert!(result.is_ok()); + } + + #[test] + fn allow_same_storage_settings() { + let factory = create_test_provider_factory_with_chain_spec(MAINNET.clone()); + let settings = StorageSettings::legacy().with_receipts_in_static_files(true); + init_genesis_with_settings(&factory, settings).unwrap(); + + let result = init_genesis_with_settings(&factory, settings); + + assert!(result.is_ok()); + } }