From 781a0aa14d9333f504e83fc4e5a9e7d61b821977 Mon Sep 17 00:00:00 2001 From: Trent Nelson Date: Fri, 7 Jan 2022 23:25:04 -0700 Subject: [PATCH] --amend (cherry picked from commit ad3cb0bc934fdbc5eedc79ee011af98e05789e67) --- runtime/src/bank.rs | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 65f1232ca5a4db..4f9f973a6cbbe9 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -361,7 +361,7 @@ struct CachedExecutorsEntry { struct CachedExecutors { max: usize, current_epoch: Epoch, - executors: HashMap, + pub(self) executors: HashMap, stats: executor_cache::Stats, } impl Default for CachedExecutors { @@ -12007,6 +12007,35 @@ pub(crate) mod tests { assert!(cache.get(&key3).is_some()); } + #[test] + fn test_cached_executors_evicts_smallest() { + let key1 = solana_sdk::pubkey::new_rand(); + let key2 = solana_sdk::pubkey::new_rand(); + let key3 = solana_sdk::pubkey::new_rand(); + let executor: Arc = Arc::new(TestExecutor {}); + let mut cache = CachedExecutors::new(2, 0); + + cache.put(&key1, executor.clone()); + for _ in 0..5 { + let _ = cache.get(&key1); + } + cache.put(&key2, executor.clone()); + // make key1's use-count for sure greater than key2's + let _ = cache.get(&key1); + + let mut entries = cache + .executors + .iter() + .map(|(k, v)| (*k, v.epoch_count.load(Relaxed))) + .collect::>(); + entries.sort_by_key(|(_, v)| *v); + assert!(entries[0].1 < entries[1].1); + + cache.put(&key3, executor.clone()); + assert!(cache.get(&entries[0].0).is_none()); + assert!(cache.get(&entries[1].0).is_some()); + } + #[test] fn test_bank_executor_cache() { solana_logger::setup();