2021-05-18 23:54:28 -07:00
|
|
|
use {
|
|
|
|
crate::rpc_subscriptions::RpcSubscriptions,
|
2022-04-01 11:47:06 -07:00
|
|
|
crossbeam_channel::RecvTimeoutError,
|
2021-05-18 23:54:28 -07:00
|
|
|
solana_ledger::blockstore::CompletedSlotsReceiver,
|
2022-08-24 09:47:02 -07:00
|
|
|
solana_rpc_client_api::response::SlotUpdate,
|
2021-05-18 23:54:28 -07:00
|
|
|
solana_sdk::timing::timestamp,
|
|
|
|
std::{
|
2022-03-31 14:44:23 -07:00
|
|
|
sync::{
|
|
|
|
atomic::{AtomicBool, Ordering},
|
|
|
|
Arc,
|
|
|
|
},
|
2021-05-18 23:54:28 -07:00
|
|
|
thread::{Builder, JoinHandle},
|
2022-03-31 14:44:23 -07:00
|
|
|
time::Duration,
|
2021-05-18 23:54:28 -07:00
|
|
|
},
|
2021-03-12 05:44:06 -08:00
|
|
|
};
|
|
|
|
|
2022-03-31 14:44:23 -07:00
|
|
|
pub const COMPLETE_SLOT_REPORT_SLEEP_MS: u64 = 100;
|
|
|
|
|
2021-03-12 05:44:06 -08:00
|
|
|
pub struct RpcCompletedSlotsService;
|
|
|
|
impl RpcCompletedSlotsService {
|
|
|
|
pub fn spawn(
|
|
|
|
completed_slots_receiver: CompletedSlotsReceiver,
|
2021-06-16 10:57:52 -07:00
|
|
|
rpc_subscriptions: Arc<RpcSubscriptions>,
|
2022-03-31 14:44:23 -07:00
|
|
|
exit: Arc<AtomicBool>,
|
2021-06-16 10:57:52 -07:00
|
|
|
) -> JoinHandle<()> {
|
|
|
|
Builder::new()
|
2022-08-17 08:40:23 -07:00
|
|
|
.name("solRpcComplSlot".to_string())
|
2022-03-31 14:44:23 -07:00
|
|
|
.spawn(move || loop {
|
2022-04-01 11:47:06 -07:00
|
|
|
// received exit signal, shutdown the service
|
2022-03-31 14:44:23 -07:00
|
|
|
if exit.load(Ordering::Relaxed) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2022-04-01 11:47:06 -07:00
|
|
|
match completed_slots_receiver
|
2022-03-31 14:44:23 -07:00
|
|
|
.recv_timeout(Duration::from_millis(COMPLETE_SLOT_REPORT_SLEEP_MS))
|
|
|
|
{
|
2022-04-01 11:47:06 -07:00
|
|
|
Err(RecvTimeoutError::Timeout) => {}
|
|
|
|
Err(RecvTimeoutError::Disconnected) => {
|
|
|
|
info!("RpcCompletedSlotService channel disconnected, exiting.");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
Ok(slots) => {
|
|
|
|
for slot in slots {
|
|
|
|
rpc_subscriptions.notify_slot_update(SlotUpdate::Completed {
|
|
|
|
slot,
|
|
|
|
timestamp: timestamp(),
|
|
|
|
});
|
|
|
|
}
|
2021-03-12 05:44:06 -08:00
|
|
|
}
|
2021-06-16 10:57:52 -07:00
|
|
|
}
|
|
|
|
})
|
|
|
|
.unwrap()
|
2021-03-12 05:44:06 -08:00
|
|
|
}
|
|
|
|
}
|