51 lines
1.5 KiB
Rust
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()
|
|
}
|
|
}
|