use CancellableTask in DnsServer

server
This commit is contained in:
Luna Yao
2026-04-18 17:18:36 +02:00
parent b0aae4f1fa
commit d5995ea1cb
+8 -9
View File
@@ -10,7 +10,6 @@ use crate::proto::dns::DnsNodeMgrRpcServer;
use crate::proto::rpc_impl::standalone::StandAloneServer; use crate::proto::rpc_impl::standalone::StandAloneServer;
use crate::tunnel::packet_def::ZCPacket; use crate::tunnel::packet_def::ZCPacket;
use crate::tunnel::tcp::TcpTunnelListener; use crate::tunnel::tcp::TcpTunnelListener;
use crate::utils::task::AsyncRuntime;
use derivative::Derivative; use derivative::Derivative;
use hickory_net::runtime::{Time, TokioTime}; use hickory_net::runtime::{Time, TokioTime};
use hickory_net::xfer::Protocol; use hickory_net::xfer::Protocol;
@@ -34,6 +33,7 @@ use tracing::{Instrument, instrument};
#[cfg(feature = "tun")] #[cfg(feature = "tun")]
use crate::instance::instance::{ArcNicCtx, NicCtx}; use crate::instance::instance::{ArcNicCtx, NicCtx};
use crate::tunnel::common::bind; use crate::tunnel::common::bind;
use crate::utils::task::CancellableTask;
#[derive(Clone)] #[derive(Clone)]
struct DynamicCatalog { struct DynamicCatalog {
@@ -169,7 +169,7 @@ impl DnsServer {
async fn reload_listeners( async fn reload_listeners(
&self, &self,
listeners: impl IntoIterator<Item = NameServerAddr>, listeners: impl IntoIterator<Item = NameServerAddr>,
runtime: &mut Option<AsyncRuntime>, runtime: &mut Option<CancellableTask>,
) -> anyhow::Result<()> { ) -> anyhow::Result<()> {
let listeners = listeners.into_iter().collect(); let listeners = listeners.into_iter().collect();
@@ -179,14 +179,12 @@ impl DnsServer {
} }
tracing::info!(?listeners, "reloading"); tracing::info!(?listeners, "reloading");
if let Some(runtime) = runtime.as_ref() if let Some(runtime) = runtime.take()
&& let Some(Err(error)) = runtime.stop(None).await && let Err(error) = runtime.stop(None).await
{ {
tracing::error!(?error, "failed to stop old DNS server runtime"); tracing::error!(?error, "failed to stop old DNS server runtime");
} }
let runtime = runtime.get_or_insert_default();
let mut server = Server::new(self.catalog.clone()); let mut server = Server::new(self.catalog.clone());
for listener in &listeners { for listener in &listeners {
let addr = listener.addr; let addr = listener.addr;
@@ -206,15 +204,16 @@ impl DnsServer {
} }
} }
runtime.start(Some(server.shutdown_token().clone()), |_| { *runtime = Some(CancellableTask::with_token(
server.shutdown_token().clone(),
async move { async move {
server server
.block_until_done() .block_until_done()
.await .await
.unwrap_or_else(|e| tracing::error!("DNS server exited with error: {:?}", e)); .unwrap_or_else(|e| tracing::error!("DNS server exited with error: {:?}", e));
} }
.instrument(tracing::info_span!("DNS server backend runtime")) .instrument(tracing::info_span!("DNS server backend runtime")),
})?; ));
*self.listeners.write() = listeners; *self.listeners.write() = listeners;