solana/core/src/staked_nodes_updater_servic...

51 lines
1.5 KiB
Rust

use {
solana_runtime::bank_forks::BankForks,
solana_sdk::pubkey::Pubkey,
solana_streamer::streamer::StakedNodes,
std::{
collections::HashMap,
sync::{
atomic::{AtomicBool, Ordering},
Arc, RwLock,
},
thread::{self, Builder, JoinHandle},
time::Duration,
},
};
const STAKE_REFRESH_CYCLE: Duration = Duration::from_secs(5);
pub struct StakedNodesUpdaterService {
thread_hdl: JoinHandle<()>,
}
impl StakedNodesUpdaterService {
pub fn new(
exit: Arc<AtomicBool>,
bank_forks: Arc<RwLock<BankForks>>,
staked_nodes: Arc<RwLock<StakedNodes>>,
staked_nodes_overrides: Arc<RwLock<HashMap<Pubkey, u64>>>,
) -> Self {
let thread_hdl = Builder::new()
.name("solStakedNodeUd".to_string())
.spawn(move || {
while !exit.load(Ordering::Relaxed) {
let stakes = {
let root_bank = bank_forks.read().unwrap().root_bank();
root_bank.staked_nodes()
};
let overrides = staked_nodes_overrides.read().unwrap().clone();
*staked_nodes.write().unwrap() = StakedNodes::new(stakes, overrides);
std::thread::sleep(STAKE_REFRESH_CYCLE);
}
})
.unwrap();
Self { thread_hdl }
}
pub fn join(self) -> thread::Result<()> {
self.thread_hdl.join()
}
}