Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
51 changes: 17 additions & 34 deletions crates/storage/trie_db/layering.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
use ethrex_common::H256;
use rayon::iter::{ParallelBridge, ParallelIterator};
use rustc_hash::FxHashMap;
use std::sync::Arc;

Expand Down Expand Up @@ -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<(Vec<u8>, Vec<u8>)>> {
Expand Down
Loading