* chore: cargo +nightly clippy --fix -Z unstable-options (cherry picked from commit6514096a67
) # Conflicts: # core/src/banking_stage.rs # core/src/cost_model.rs # core/src/cost_tracker.rs # core/src/execute_cost_table.rs # core/src/replay_stage.rs # core/src/tvu.rs # ledger-tool/src/main.rs # programs/bpf_loader/build.rs # rbpf-cli/src/main.rs # sdk/cargo-build-bpf/src/main.rs # sdk/cargo-test-bpf/src/main.rs # sdk/src/secp256k1_instruction.rs * chore: cargo fmt (cherry picked from commit789f33e8db
) * Updates BPF program assert_instruction_count tests. (cherry picked from commitc1e03f3410
) # Conflicts: # programs/bpf/tests/programs.rs * Resolve conflicts Co-authored-by: Alexander Meißner <AlexanderMeissner@gmx.net> Co-authored-by: Michael Vines <mvines@gmail.com>
78 lines
1.9 KiB
Rust
78 lines
1.9 KiB
Rust
use {
|
|
crate::{rpc_config::RpcLargestAccountsFilter, rpc_response::RpcAccountBalance},
|
|
std::{
|
|
collections::HashMap,
|
|
time::{Duration, SystemTime},
|
|
},
|
|
};
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct LargestAccountsCache {
|
|
duration: u64,
|
|
cache: HashMap<Option<RpcLargestAccountsFilter>, LargestAccountsCacheValue>,
|
|
}
|
|
|
|
#[derive(Debug, Clone)]
|
|
struct LargestAccountsCacheValue {
|
|
accounts: Vec<RpcAccountBalance>,
|
|
slot: u64,
|
|
cached_time: SystemTime,
|
|
}
|
|
|
|
impl LargestAccountsCache {
|
|
pub fn new(duration: u64) -> Self {
|
|
Self {
|
|
duration,
|
|
cache: HashMap::new(),
|
|
}
|
|
}
|
|
|
|
pub fn get_largest_accounts(
|
|
&self,
|
|
filter: &Option<RpcLargestAccountsFilter>,
|
|
) -> Option<(u64, Vec<RpcAccountBalance>)> {
|
|
self.cache.get(filter).and_then(|value| {
|
|
if let Ok(elapsed) = value.cached_time.elapsed() {
|
|
if elapsed < Duration::from_secs(self.duration) {
|
|
return Some((value.slot, value.accounts.clone()));
|
|
}
|
|
}
|
|
None
|
|
})
|
|
}
|
|
|
|
pub fn set_largest_accounts(
|
|
&mut self,
|
|
filter: &Option<RpcLargestAccountsFilter>,
|
|
slot: u64,
|
|
accounts: &[RpcAccountBalance],
|
|
) {
|
|
self.cache.insert(
|
|
filter.clone(),
|
|
LargestAccountsCacheValue {
|
|
accounts: accounts.to_owned(),
|
|
slot,
|
|
cached_time: SystemTime::now(),
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
pub mod test {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn test_old_entries_expire() {
|
|
let mut cache = LargestAccountsCache::new(1);
|
|
|
|
let filter = Some(RpcLargestAccountsFilter::Circulating);
|
|
|
|
let accounts: Vec<RpcAccountBalance> = Vec::new();
|
|
|
|
cache.set_largest_accounts(&filter, 1000, &accounts);
|
|
std::thread::sleep(Duration::from_secs(1));
|
|
assert_eq!(cache.get_largest_accounts(&filter), None);
|
|
}
|
|
}
|