diff --git a/CHANGELOG.md b/CHANGELOG.md index d82ef9443ab..2261b9d4534 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### 2025-11-11 +- Insert instead of merge for bloom rebuilds [#5223](https://github.com/lambdaclass/ethrex/pull/5223) - Replace sha3 keccak to an assembly version using ffi [#5247](https://github.com/lambdaclass/ethrex/pull/5247) - Fix `FlatKeyValue` generation on fullsync mode [#5274](https://github.com/lambdaclass/ethrex/pull/5274) diff --git a/crates/storage/trie_db/layering.rs b/crates/storage/trie_db/layering.rs index eceea661d42..8530a94a340 100644 --- a/crates/storage/trie_db/layering.rs +++ b/crates/storage/trie_db/layering.rs @@ -1,5 +1,4 @@ use ethrex_common::H256; -use rayon::iter::{ParallelBridge, ParallelIterator}; use rustc_hash::FxHashMap; use std::sync::Arc; @@ -133,45 +132,29 @@ impl TrieLayerCache { self.layers.insert(state_root, Arc::new(entry)); } - /// Rebuilds the global bloom filter accruing all current existing layers. + /// Rebuilds the global bloom filter by inserting all keys from all layers. pub fn rebuild_bloom(&mut self) { - let mut blooms: Vec<_> = self - .layers - .values() - .par_bridge() - .map(|entry| { - let Ok(mut bloom) = Self::create_filter() else { - tracing::warn!("TrieLayerCache: rebuild_bloom could not create filter"); - return None; - }; - for (p, _) in entry.nodes.iter() { - if let Err(qfilter::Error::CapacityExceeded) = bloom.insert(p) { - tracing::warn!("TrieLayerCache: rebuild_bloom capacity exceeded"); - return None; - } - } - Some(bloom) - }) - .collect(); - - let Some(mut ret) = blooms.pop().flatten() else { - tracing::warn!("TrieLayerCache: rebuild_bloom no valid bloom found"); + let Ok(mut new_global_filter) = Self::create_filter() else { + tracing::warn!( + "TrieLayerCache: rebuild_bloom could not create new filter. Poisoning bloom." + ); self.bloom = None; return; }; - for bloom in blooms.iter() { - let Some(bloom) = bloom else { - tracing::warn!("TrieLayerCache: rebuild_bloom no valid bloom found"); - self.bloom = None; - return; - }; - if let Err(qfilter::Error::CapacityExceeded) = ret.merge(false, bloom) { - tracing::warn!("TrieLayerCache: rebuild_bloom capacity exceeded"); - self.bloom = None; - return; + + for layer in self.layers.values() { + for path in layer.nodes.keys() { + if let Err(qfilter::Error::CapacityExceeded) = new_global_filter.insert(path) { + tracing::warn!( + "TrieLayerCache: rebuild_bloom capacity exceeded. Poisoning bloom." + ); + self.bloom = None; + return; + } } } - self.bloom = Some(ret); + + self.bloom = Some(new_global_filter); } pub fn commit(&mut self, state_root: H256) -> Option, Vec)>> {