Skip to content

Commit 02f8aa0

Browse files
committed
do not update cache if disabled
1 parent 9cb2398 commit 02f8aa0

File tree

3 files changed

+53
-37
lines changed

3 files changed

+53
-37
lines changed

crates/engine/tree/src/tree/payload_processor/mod.rs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ where
104104
cross_block_cache_size: u64,
105105
/// Whether transactions should not be executed on prewarming task.
106106
disable_transaction_prewarming: bool,
107+
/// Whether state cache should be disable
108+
disable_state_cache: bool,
107109
/// Determines how to configure the evm for execution.
108110
evm_config: Evm,
109111
/// Whether precompile cache should be disabled.
@@ -147,6 +149,7 @@ where
147149
cross_block_cache_size: config.cross_block_cache_size(),
148150
disable_transaction_prewarming: config.disable_prewarming(),
149151
evm_config,
152+
disable_state_cache: config.disable_state_cache(),
150153
precompile_cache_disabled: config.precompile_cache_disabled(),
151154
precompile_cache_map,
152155
sparse_state_trie: Arc::default(),
@@ -351,9 +354,15 @@ where
351354
transactions = mpsc::channel().1;
352355
}
353356

354-
let saved_cache = self.cache_for(env.parent_hash);
355-
let cache = saved_cache.cache().clone();
356-
let cache_metrics = saved_cache.metrics().clone();
357+
let (saved_cache, cache, cache_metrics) = if self.disable_state_cache {
358+
(None, None, None)
359+
} else {
360+
let saved_cache = self.cache_for(env.parent_hash);
361+
let cache = saved_cache.cache().clone();
362+
let cache_metrics = saved_cache.metrics().clone();
363+
(Some(saved_cache), Some(cache), Some(cache_metrics))
364+
};
365+
357366
// configure prewarming
358367
let prewarm_ctx = PrewarmContext {
359368
env,
@@ -565,12 +574,12 @@ impl<Tx, Err> PayloadHandle<Tx, Err> {
565574
}
566575

567576
/// Returns a clone of the caches used by prewarming
568-
pub(super) fn caches(&self) -> StateExecutionCache {
577+
pub(super) fn caches(&self) -> Option<StateExecutionCache> {
569578
self.prewarm_handle.cache.clone()
570579
}
571580

572581
/// Returns a clone of the cache metrics used by prewarming
573-
pub(super) fn cache_metrics(&self) -> CachedStateMetrics {
582+
pub(super) fn cache_metrics(&self) -> Option<CachedStateMetrics> {
574583
self.prewarm_handle.cache_metrics.clone()
575584
}
576585

@@ -600,9 +609,9 @@ impl<Tx, Err> PayloadHandle<Tx, Err> {
600609
#[derive(Debug)]
601610
pub(crate) struct CacheTaskHandle {
602611
/// The shared cache the task operates with.
603-
cache: StateExecutionCache,
612+
cache: Option<StateExecutionCache>,
604613
/// Metrics for the caches
605-
cache_metrics: CachedStateMetrics,
614+
cache_metrics: Option<CachedStateMetrics>,
606615
/// Channel to the spawned prewarm task if any
607616
to_prewarm_task: Option<std::sync::mpsc::Sender<PrewarmTaskEvent>>,
608617
}

crates/engine/tree/src/tree/payload_processor/prewarm.rs

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use metrics::{Counter, Gauge, Histogram};
2929
use reth_evm::{execute::ExecutableTxFor, ConfigureEvm, Evm, EvmFor, SpecFor};
3030
use reth_metrics::Metrics;
3131
use reth_primitives_traits::NodePrimitives;
32-
use reth_provider::{BlockReader, StateProviderFactory, StateReader};
32+
use reth_provider::{BlockReader, StateProvider, StateProviderFactory, StateReader};
3333
use reth_revm::{database::StateProviderDatabase, db::BundleState, state::EvmState};
3434
use reth_trie::MultiProofTargets;
3535
use std::{
@@ -255,31 +255,35 @@ where
255255
self;
256256
let hash = env.hash;
257257

258-
debug!(target: "engine::caching", parent_hash=?hash, "Updating execution cache");
259-
// Perform all cache operations atomically under the lock
260-
execution_cache.update_with_guard(|cached| {
261-
// consumes the `SavedCache` held by the prewarming task, which releases its usage guard
262-
let (caches, cache_metrics) = saved_cache.split();
263-
let new_cache = SavedCache::new(hash, caches, cache_metrics);
264-
265-
// Insert state into cache while holding the lock
266-
if new_cache.cache().insert_state(&state).is_err() {
267-
// Clear the cache on error to prevent having a polluted cache
268-
*cached = None;
269-
debug!(target: "engine::caching", "cleared execution cache on update error");
270-
return;
271-
}
258+
if let Some(saved_cache) = saved_cache {
259+
debug!(target: "engine::caching", parent_hash=?hash, "Updating execution cache");
260+
// Perform all cache operations atomically under the lock
261+
execution_cache.update_with_guard(|cached| {
262+
// consumes the `SavedCache` held by the prewarming task, which releases its usage
263+
// guard
264+
let (caches, cache_metrics) = saved_cache.split();
265+
let new_cache = SavedCache::new(hash, caches, cache_metrics);
266+
267+
// Insert state into cache while holding the lock
268+
if new_cache.cache().insert_state(&state).is_err() {
269+
// Clear the cache on error to prevent having a polluted cache
270+
*cached = None;
271+
debug!(target: "engine::caching", "cleared execution cache on update error");
272+
return;
273+
}
272274

273-
new_cache.update_metrics();
275+
new_cache.update_metrics();
274276

275-
// Replace the shared cache with the new one; the previous cache (if any) is dropped.
276-
*cached = Some(new_cache);
277-
});
277+
// Replace the shared cache with the new one; the previous cache (if any) is
278+
// dropped.
279+
*cached = Some(new_cache);
280+
});
278281

279-
let elapsed = start.elapsed();
280-
debug!(target: "engine::caching", parent_hash=?hash, elapsed=?elapsed, "Updated execution cache");
282+
let elapsed = start.elapsed();
283+
debug!(target: "engine::caching", parent_hash=?hash, elapsed=?elapsed, "Updated execution cache");
281284

282-
metrics.cache_saving_duration.set(elapsed.as_secs_f64());
285+
metrics.cache_saving_duration.set(elapsed.as_secs_f64());
286+
}
283287
}
284288

285289
/// Executes the task.
@@ -356,7 +360,7 @@ where
356360
{
357361
pub(super) env: ExecutionEnv<Evm>,
358362
pub(super) evm_config: Evm,
359-
pub(super) saved_cache: SavedCache,
363+
pub(super) saved_cache: Option<SavedCache>,
360364
/// Provider to obtain the state
361365
pub(super) provider: StateProviderBuilder<N, P>,
362366
pub(super) metrics: PrewarmMetrics,
@@ -400,10 +404,13 @@ where
400404
};
401405

402406
// Use the caches to create a new provider with caching
403-
let caches = saved_cache.cache().clone();
404-
let cache_metrics = saved_cache.metrics().clone();
405-
let state_provider =
406-
CachedStateProvider::new_with_caches(state_provider, caches, cache_metrics);
407+
let state_provider: Box<dyn StateProvider> = if let Some(saved_cache) = saved_cache {
408+
let caches = saved_cache.cache().clone();
409+
let cache_metrics = saved_cache.metrics().clone();
410+
Box::new(CachedStateProvider::new_with_caches(state_provider, caches, cache_metrics))
411+
} else {
412+
state_provider
413+
};
407414

408415
let state_provider = StateProviderDatabase::new(state_provider);
409416

crates/engine/tree/src/tree/payload_validator.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -397,11 +397,11 @@ where
397397

398398
// Use cached state provider before executing, used in execution after prewarming threads
399399
// complete
400-
if !self.config.disable_state_cache() {
400+
if let Some((caches, cache_metrics)) = handle.caches().zip(handle.cache_metrics()) {
401401
state_provider = Box::new(CachedStateProvider::new_with_caches(
402402
state_provider,
403-
handle.caches(),
404-
handle.cache_metrics(),
403+
caches,
404+
cache_metrics,
405405
));
406406
};
407407

0 commit comments

Comments
 (0)