datanode/
event_listener.rsuse common_telemetry::error;
use store_api::storage::RegionId;
use tokio::sync::mpsc::{self, UnboundedReceiver, UnboundedSender};
pub enum RegionServerEvent {
Registered(RegionId),
Deregistered(RegionId),
}
pub trait RegionServerEventListener: Sync + Send {
fn on_region_registered(&self, _region_id: RegionId) {}
fn on_region_deregistered(&self, _region_id: RegionId) {}
}
pub type RegionServerEventListenerRef = Box<dyn RegionServerEventListener>;
pub struct NoopRegionServerEventListener;
impl RegionServerEventListener for NoopRegionServerEventListener {}
#[derive(Debug, Clone)]
pub struct RegionServerEventSender(pub(crate) UnboundedSender<RegionServerEvent>);
impl RegionServerEventListener for RegionServerEventSender {
fn on_region_registered(&self, region_id: RegionId) {
if let Err(e) = self.0.send(RegionServerEvent::Registered(region_id)) {
error!(e; "Failed to send registering region: {region_id} event");
}
}
fn on_region_deregistered(&self, region_id: RegionId) {
if let Err(e) = self.0.send(RegionServerEvent::Deregistered(region_id)) {
error!(e; "Failed to send deregistering region: {region_id} event");
}
}
}
pub struct RegionServerEventReceiver(pub(crate) UnboundedReceiver<RegionServerEvent>);
pub fn new_region_server_event_channel() -> (RegionServerEventSender, RegionServerEventReceiver) {
let (tx, rx) = mpsc::unbounded_channel();
(RegionServerEventSender(tx), RegionServerEventReceiver(rx))
}