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();