diff --git a/crates/trie/sparse/src/arena/mod.rs b/crates/trie/sparse/src/arena/mod.rs index 29643e80e5e..a4d31d674fb 100644 --- a/crates/trie/sparse/src/arena/mod.rs +++ b/crates/trie/sparse/src/arena/mod.rs @@ -2670,8 +2670,14 @@ impl SparseTrie for ArenaParallelSparseTrie { return 0; } - let mut retained_leaves = retained_leaves.to_vec(); - retained_leaves.sort_unstable(); + let retained_leaves = if retained_leaves.windows(2).all(|w| w[0] <= w[1]) { + Cow::Borrowed(retained_leaves) + } else { + let mut retained = retained_leaves.to_vec(); + retained.sort_unstable(); + retained.dedup(); + Cow::Owned(retained) + }; let threshold = self.parallelism_thresholds.min_leaves_for_prune; diff --git a/crates/trie/sparse/src/parallel.rs b/crates/trie/sparse/src/parallel.rs index fa97e308a15..27a40dadb9f 100644 --- a/crates/trie/sparse/src/parallel.rs +++ b/crates/trie/sparse/src/parallel.rs @@ -1158,8 +1158,14 @@ impl SparseTrie for ParallelSparseTrie { #[cfg(feature = "trie-debug")] self.debug_recorder.reset(); - let mut retained_leaves = retained_leaves.to_vec(); - retained_leaves.sort_unstable(); + let retained_leaves = if retained_leaves.windows(2).all(|w| w[0] <= w[1]) { + Cow::Borrowed(retained_leaves) + } else { + let mut retained = retained_leaves.to_vec(); + retained.sort_unstable(); + retained.dedup(); + Cow::Owned(retained) + }; let mut effective_pruned_roots = Vec::::new(); let mut stack: SmallVec<[Nibbles; 32]> = SmallVec::new(); diff --git a/crates/trie/sparse/src/state.rs b/crates/trie/sparse/src/state.rs index 8b35d8ab7be..a021e41e704 100644 --- a/crates/trie/sparse/src/state.rs +++ b/crates/trie/sparse/src/state.rs @@ -875,8 +875,9 @@ where self.hot_accounts_lfu.decay_and_evict(max_hot_accounts); let retained = self.hot_slots_lfu.retained_slots_by_address(); - let retained_account_paths: Vec = + let mut retained_account_paths: Vec = self.hot_accounts_lfu.keys().map(|k| Nibbles::unpack(*k)).collect(); + retained_account_paths.sort_unstable(); let retained_accounts = retained_account_paths.len(); let retained_storage_tries = retained.len();