mirror of
https://github.com/paradigmxyz/reth.git
synced 2026-04-30 03:01:58 -04:00
feat(engine): allow configuring tree to always use state root fallback (#16569)
This commit is contained in:
3
book/cli/reth/node.md
vendored
3
book/cli/reth/node.md
vendored
@@ -768,6 +768,9 @@ Engine:
|
|||||||
--engine.precompile-cache
|
--engine.precompile-cache
|
||||||
Enable precompile cache
|
Enable precompile cache
|
||||||
|
|
||||||
|
--engine.state-root-fallback
|
||||||
|
Enable state root fallback, useful for testing
|
||||||
|
|
||||||
Ress:
|
Ress:
|
||||||
--ress.enable
|
--ress.enable
|
||||||
Enable support for `ress` subprotocol
|
Enable support for `ress` subprotocol
|
||||||
|
|||||||
@@ -77,6 +77,8 @@ pub struct TreeConfig {
|
|||||||
reserved_cpu_cores: usize,
|
reserved_cpu_cores: usize,
|
||||||
/// Whether to enable the precompile cache
|
/// Whether to enable the precompile cache
|
||||||
precompile_cache_enabled: bool,
|
precompile_cache_enabled: bool,
|
||||||
|
/// Whether to use state root fallback for testing
|
||||||
|
state_root_fallback: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for TreeConfig {
|
impl Default for TreeConfig {
|
||||||
@@ -96,6 +98,7 @@ impl Default for TreeConfig {
|
|||||||
max_proof_task_concurrency: DEFAULT_MAX_PROOF_TASK_CONCURRENCY,
|
max_proof_task_concurrency: DEFAULT_MAX_PROOF_TASK_CONCURRENCY,
|
||||||
reserved_cpu_cores: DEFAULT_RESERVED_CPU_CORES,
|
reserved_cpu_cores: DEFAULT_RESERVED_CPU_CORES,
|
||||||
precompile_cache_enabled: false,
|
precompile_cache_enabled: false,
|
||||||
|
state_root_fallback: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -118,6 +121,7 @@ impl TreeConfig {
|
|||||||
max_proof_task_concurrency: u64,
|
max_proof_task_concurrency: u64,
|
||||||
reserved_cpu_cores: usize,
|
reserved_cpu_cores: usize,
|
||||||
precompile_cache_enabled: bool,
|
precompile_cache_enabled: bool,
|
||||||
|
state_root_fallback: bool,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
persistence_threshold,
|
persistence_threshold,
|
||||||
@@ -134,6 +138,7 @@ impl TreeConfig {
|
|||||||
max_proof_task_concurrency,
|
max_proof_task_concurrency,
|
||||||
reserved_cpu_cores,
|
reserved_cpu_cores,
|
||||||
precompile_cache_enabled,
|
precompile_cache_enabled,
|
||||||
|
state_root_fallback,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -204,6 +209,11 @@ impl TreeConfig {
|
|||||||
self.precompile_cache_enabled
|
self.precompile_cache_enabled
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns whether to use state root fallback.
|
||||||
|
pub const fn state_root_fallback(&self) -> bool {
|
||||||
|
self.state_root_fallback
|
||||||
|
}
|
||||||
|
|
||||||
/// Setter for persistence threshold.
|
/// Setter for persistence threshold.
|
||||||
pub const fn with_persistence_threshold(mut self, persistence_threshold: u64) -> Self {
|
pub const fn with_persistence_threshold(mut self, persistence_threshold: u64) -> Self {
|
||||||
self.persistence_threshold = persistence_threshold;
|
self.persistence_threshold = persistence_threshold;
|
||||||
@@ -307,6 +317,12 @@ impl TreeConfig {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Setter for whether to use state root fallback, useful for testing.
|
||||||
|
pub const fn with_state_root_fallback(mut self, state_root_fallback: bool) -> Self {
|
||||||
|
self.state_root_fallback = state_root_fallback;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Whether or not to use state root task
|
/// Whether or not to use state root task
|
||||||
pub const fn use_state_root_task(&self) -> bool {
|
pub const fn use_state_root_task(&self) -> bool {
|
||||||
self.has_enough_parallelism && !self.legacy_state_root
|
self.has_enough_parallelism && !self.legacy_state_root
|
||||||
|
|||||||
@@ -2077,7 +2077,9 @@ where
|
|||||||
//
|
//
|
||||||
// See https://github.com/paradigmxyz/reth/issues/12688 for more details
|
// See https://github.com/paradigmxyz/reth/issues/12688 for more details
|
||||||
let persisting_kind = self.persisting_kind_for(block.header());
|
let persisting_kind = self.persisting_kind_for(block.header());
|
||||||
let run_parallel_state_root = persisting_kind.can_run_parallel_state_root();
|
// don't run parallel if state root fallback is set
|
||||||
|
let run_parallel_state_root =
|
||||||
|
persisting_kind.can_run_parallel_state_root() && !self.config.state_root_fallback();
|
||||||
|
|
||||||
// use prewarming background task
|
// use prewarming background task
|
||||||
let header = block.clone_sealed_header();
|
let header = block.clone_sealed_header();
|
||||||
@@ -2215,8 +2217,13 @@ where
|
|||||||
maybe_state_root
|
maybe_state_root
|
||||||
} else {
|
} else {
|
||||||
// fallback is to compute the state root regularly in sync
|
// fallback is to compute the state root regularly in sync
|
||||||
warn!(target: "engine::tree", block=?block_num_hash, ?persisting_kind, "Failed to compute state root in parallel");
|
if self.config.state_root_fallback() {
|
||||||
self.metrics.block_validation.state_root_parallel_fallback_total.increment(1);
|
debug!(target: "engine::tree", block=?block_num_hash, "Using state root fallback for testing");
|
||||||
|
} else {
|
||||||
|
warn!(target: "engine::tree", block=?block_num_hash, ?persisting_kind, "Failed to compute state root in parallel");
|
||||||
|
self.metrics.block_validation.state_root_parallel_fallback_total.increment(1);
|
||||||
|
}
|
||||||
|
|
||||||
let (root, updates) =
|
let (root, updates) =
|
||||||
ensure_ok!(state_provider.state_root_with_updates(hashed_state.clone()));
|
ensure_ok!(state_provider.state_root_with_updates(hashed_state.clone()));
|
||||||
(root, updates, root_time.elapsed())
|
(root, updates, root_time.elapsed())
|
||||||
|
|||||||
@@ -63,6 +63,10 @@ pub struct EngineArgs {
|
|||||||
/// Enable precompile cache
|
/// Enable precompile cache
|
||||||
#[arg(long = "engine.precompile-cache", default_value = "false")]
|
#[arg(long = "engine.precompile-cache", default_value = "false")]
|
||||||
pub precompile_cache_enabled: bool,
|
pub precompile_cache_enabled: bool,
|
||||||
|
|
||||||
|
/// Enable state root fallback, useful for testing
|
||||||
|
#[arg(long = "engine.state-root-fallback", default_value = "false")]
|
||||||
|
pub state_root_fallback: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for EngineArgs {
|
impl Default for EngineArgs {
|
||||||
@@ -80,6 +84,7 @@ impl Default for EngineArgs {
|
|||||||
max_proof_task_concurrency: DEFAULT_MAX_PROOF_TASK_CONCURRENCY,
|
max_proof_task_concurrency: DEFAULT_MAX_PROOF_TASK_CONCURRENCY,
|
||||||
reserved_cpu_cores: DEFAULT_RESERVED_CPU_CORES,
|
reserved_cpu_cores: DEFAULT_RESERVED_CPU_CORES,
|
||||||
precompile_cache_enabled: false,
|
precompile_cache_enabled: false,
|
||||||
|
state_root_fallback: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -98,6 +103,7 @@ impl EngineArgs {
|
|||||||
.with_max_proof_task_concurrency(self.max_proof_task_concurrency)
|
.with_max_proof_task_concurrency(self.max_proof_task_concurrency)
|
||||||
.with_reserved_cpu_cores(self.reserved_cpu_cores)
|
.with_reserved_cpu_cores(self.reserved_cpu_cores)
|
||||||
.with_precompile_cache_enabled(self.precompile_cache_enabled)
|
.with_precompile_cache_enabled(self.precompile_cache_enabled)
|
||||||
|
.with_state_root_fallback(self.state_root_fallback)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user