diff --git a/easytier/src/dns/peer_mgr.rs b/easytier/src/dns/peer_mgr.rs index 67e420e9..097bbb7a 100644 --- a/easytier/src/dns/peer_mgr.rs +++ b/easytier/src/dns/peer_mgr.rs @@ -1,28 +1,32 @@ -use std::sync::Arc; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::time::Duration; +use crate::common::config::ConfigLoader; +use crate::common::PeerId; +use crate::dns::config::{DnsExportConfig, DnsGlobalCtxExt}; +use crate::dns::utils::NameServerAddrGroup; +use crate::peer_center::instance::PeerCenterPeerManagerTrait; +use crate::peers::peer_manager::PeerManager; +use crate::proto; +use crate::proto::dns::{DnsPeerManagerRpc, DnsPeerManagerRpcClientFactory, GetExportConfigRequest, GetExportConfigResponse, ZoneData}; +use crate::proto::rpc_types; +use crate::proto::rpc_types::controller::BaseController; +use anyhow::Context; use derivative::Derivative; use derive_more::Deref; use moka::future::Cache; -use url::Url; -use anyhow::Context; -use crate::common::config::ConfigLoader; -use crate::common::PeerId; -use crate::dns::config::DnsGlobalCtxExt; -use crate::peer_center::instance::PeerCenterPeerManagerTrait; -use crate::peers::peer_manager::PeerManager; -use crate::proto::dns::{DeterministicDigest, DnsPeerManagerRpc, DnsPeerManagerRpcClientFactory, DnsSnapshot, GetExportConfigRequest, GetExportConfigResponse}; -use crate::proto::rpc_types; -use crate::proto::rpc_types::controller::BaseController; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::Arc; +use std::time::Duration; +use itertools::Itertools; +use serde::Serialize; +use crate::utils::DeterministicDigest; #[derive(Debug, Clone)] pub struct DnsPeerInfo { digest: Vec, - config: GetExportConfigResponse, + config: DnsExportConfig, } impl DnsPeerInfo { - pub fn new(config: GetExportConfigResponse) -> Self { + pub fn new(config: DnsExportConfig) -> Self { Self { digest: config.digest(), config, @@ -30,6 +34,35 @@ impl DnsPeerInfo { } } +#[derive(Debug, Clone, Default, Serialize)] +pub struct DnsSnapshot { + pub(super) zones: Vec, + pub(super) addresses: NameServerAddrGroup, + pub(super) listeners: NameServerAddrGroup, +} + +impl From for proto::dns::DnsSnapshot { + fn from(value: DnsSnapshot) -> Self { + Self { + zones: value.zones, + addresses: value.addresses.into(), + listeners: value.listeners.into(), + } + } +} + +impl TryFrom for DnsSnapshot { + type Error = anyhow::Error; + + fn try_from(value: proto::dns::DnsSnapshot) -> Result { + Ok(Self { + zones: value.zones, + addresses: (&value.addresses).try_into()?, + listeners: (&value.listeners).try_into()?, + }) + } +} + const DNS_PEER_TTL: Duration = Duration::from_secs(3); #[derive(Derivative, Deref)] @@ -46,10 +79,7 @@ impl DnsPeerMgr { pub fn new(peer_mgr: Arc) -> Self { Self { mgr: peer_mgr.clone(), - peers: Cache::builder() - .time_to_live(DNS_PEER_TTL) - .build() - .into(), + peers: Cache::builder().time_to_live(DNS_PEER_TTL).build(), dirty: AtomicBool::new(true), } } @@ -60,27 +90,17 @@ impl DnsPeerMgr { let mut zones = Vec::new(); - zones.extend(config.zones.iter().map(Into::into)); - zones.extend(global_ctx.dns_self_zone().as_ref().map(Into::into)); + zones.extend(config.zones.iter().cloned().map_into()); + zones.extend(global_ctx.dns_self_zone().map(Into::into)); for (_, info) in self.peers.iter() { - zones.extend(info.config.zones.clone().into_iter()); + zones.extend(info.config.zones.iter().cloned()); } DnsSnapshot { zones, - addresses: config - .addresses - .clone() - .into_iter() - .map(Into::into) - .collect(), - listeners: config - .listeners - .iter() - .map(Url::from) - .map(Into::into) - .collect(), + addresses: config.addresses.clone(), + listeners: config.listeners.clone(), } } @@ -96,7 +116,7 @@ impl DnsPeerMgr { self.peers.insert(peer_id, DnsPeerInfo::new(config)).await; } Err(e) => { - tracing::warn!("failed to fetch dns config from peer {}: {:?}", peer_id, e); + tracing::warn!("failed to fetch dns export config from peer {}: {:?}", peer_id, e); self.peers.invalidate(&peer_id).await; } } @@ -104,7 +124,7 @@ impl DnsPeerMgr { self.dirty.store(true, Ordering::Release); } - async fn fetch(&self, peer_id: PeerId) -> anyhow::Result { + async fn fetch(&self, peer_id: PeerId) -> anyhow::Result { self.get_peer_rpc_mgr() .rpc_client() .scoped_client::>( @@ -129,4 +149,4 @@ impl DnsPeerManagerRpc for DnsPeerMgr { ) -> rpc_types::error::Result { Ok(self.get_global_ctx_ref().dns_export_config()) } -} \ No newline at end of file +}