use std::sync::Arc;
use async_trait::async_trait;
use crate::error::Result;
use crate::rpc_codec::{PingRequest, RaftRpc};
use crate::transport::NexarTransport;
#[async_trait]
pub trait ReachabilityProber: Send + Sync {
async fn probe(&self, peer: u64) -> Result<()>;
}
pub struct TransportProber {
transport: Arc<NexarTransport>,
self_node_id: u64,
}
impl TransportProber {
pub fn new(transport: Arc<NexarTransport>, self_node_id: u64) -> Self {
Self {
transport,
self_node_id,
}
}
}
#[async_trait]
impl ReachabilityProber for TransportProber {
async fn probe(&self, peer: u64) -> Result<()> {
let rpc = RaftRpc::Ping(PingRequest {
sender_id: self.self_node_id,
topology_version: 0,
});
self.transport.send_rpc(peer, rpc).await.map(|_| ())
}
}
pub struct NoopProber;
#[async_trait]
impl ReachabilityProber for NoopProber {
async fn probe(&self, _peer: u64) -> Result<()> {
Ok(())
}
}