feat(storage): warn storage settings diff at startup (#21320)

Co-authored-by: YK <chiayongkang@hotmail.com>
This commit is contained in:
Georgios Konstantopoulos
2026-01-22 08:40:10 -08:00
committed by GitHub
parent bf43ebaa29
commit 247ce3c4e9

View File

@@ -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<Primitives: NodePrimitives<BlockHeader: Compact>>
+ ChainSpecProvider
+ StageCheckpointReader
+ BlockHashReader
+ BlockNumReader
+ MetadataProvider
+ StorageSettingsCache,
PF::ProviderRW: StaticFileProviderFactory<Primitives = PF::Primitives>
+ StageCheckpointWriter
@@ -124,7 +126,8 @@ where
+ StaticFileProviderFactory<Primitives: NodePrimitives<BlockHeader: Compact>>
+ ChainSpecProvider
+ StageCheckpointReader
+ BlockHashReader
+ BlockNumReader
+ MetadataProvider
+ StorageSettingsCache,
PF::ProviderRW: StaticFileProviderFactory<Primitives = PF::Primitives>
+ 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());
}
}