2021-11-17 17:11:38 -08:00
|
|
|
use {
|
|
|
|
crate::accountsdb_plugin_manager::AccountsDbPluginManager,
|
|
|
|
log::*,
|
|
|
|
solana_accountsdb_plugin_interface::accountsdb_plugin_interface::SlotStatus,
|
|
|
|
solana_measure::measure::Measure,
|
|
|
|
solana_metrics::*,
|
|
|
|
solana_sdk::clock::Slot,
|
|
|
|
std::sync::{Arc, RwLock},
|
|
|
|
};
|
|
|
|
|
|
|
|
pub trait SlotStatusNotifierInterface {
|
|
|
|
/// Notified when a slot is optimistically confirmed
|
|
|
|
fn notify_slot_confirmed(&self, slot: Slot, parent: Option<Slot>);
|
|
|
|
|
|
|
|
/// Notified when a slot is marked frozen.
|
|
|
|
fn notify_slot_processed(&self, slot: Slot, parent: Option<Slot>);
|
|
|
|
|
|
|
|
/// Notified when a slot is rooted.
|
|
|
|
fn notify_slot_rooted(&self, slot: Slot, parent: Option<Slot>);
|
|
|
|
}
|
|
|
|
|
|
|
|
pub type SlotStatusNotifier = Arc<RwLock<dyn SlotStatusNotifierInterface + Sync + Send>>;
|
|
|
|
|
|
|
|
pub struct SlotStatusNotifierImpl {
|
|
|
|
plugin_manager: Arc<RwLock<AccountsDbPluginManager>>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl SlotStatusNotifierInterface for SlotStatusNotifierImpl {
|
|
|
|
fn notify_slot_confirmed(&self, slot: Slot, parent: Option<Slot>) {
|
|
|
|
self.notify_slot_status(slot, parent, SlotStatus::Confirmed);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn notify_slot_processed(&self, slot: Slot, parent: Option<Slot>) {
|
|
|
|
self.notify_slot_status(slot, parent, SlotStatus::Processed);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn notify_slot_rooted(&self, slot: Slot, parent: Option<Slot>) {
|
|
|
|
self.notify_slot_status(slot, parent, SlotStatus::Rooted);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl SlotStatusNotifierImpl {
|
|
|
|
pub fn new(plugin_manager: Arc<RwLock<AccountsDbPluginManager>>) -> Self {
|
|
|
|
Self { plugin_manager }
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn notify_slot_status(&self, slot: Slot, parent: Option<Slot>, slot_status: SlotStatus) {
|
|
|
|
let mut plugin_manager = self.plugin_manager.write().unwrap();
|
|
|
|
if plugin_manager.plugins.is_empty() {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
for plugin in plugin_manager.plugins.iter_mut() {
|
|
|
|
let mut measure = Measure::start("accountsdb-plugin-update-slot");
|
2022-03-02 12:49:11 -08:00
|
|
|
match plugin.update_slot_status(slot, parent, slot_status) {
|
2021-11-17 17:11:38 -08:00
|
|
|
Err(err) => {
|
|
|
|
error!(
|
|
|
|
"Failed to update slot status at slot {}, error: {} to plugin {}",
|
|
|
|
slot,
|
|
|
|
err,
|
|
|
|
plugin.name()
|
|
|
|
)
|
|
|
|
}
|
|
|
|
Ok(_) => {
|
|
|
|
trace!(
|
|
|
|
"Successfully updated slot status at slot {} to plugin {}",
|
|
|
|
slot,
|
|
|
|
plugin.name()
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
measure.stop();
|
|
|
|
inc_new_counter_debug!(
|
|
|
|
"accountsdb-plugin-update-slot-us",
|
|
|
|
measure.as_us() as usize,
|
|
|
|
1000,
|
|
|
|
1000
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|