Skip to content

Commit 9e685a2

Browse files
committed
cancel previous dns request if a new one is made
1 parent 5d1745a commit 9e685a2

File tree

1 file changed

+13
-2
lines changed

1 file changed

+13
-2
lines changed

src/dns.rs

+13-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::net::IpAddr;
1+
use std::{collections::HashMap, net::IpAddr};
22

33
use local_channel::mpsc::{channel, Receiver, Sender};
44
use tokio::task::{spawn_local, JoinHandle};
@@ -30,6 +30,7 @@ struct DnsTask {
3030
request_rx: Receiver<DnsRequest>,
3131
event_tx: Sender<DnsEvent>,
3232
cancellation_token: CancellationToken,
33+
active_tasks: HashMap<ClientHandle, JoinHandle<()>>,
3334
}
3435

3536
impl DnsResolver {
@@ -39,6 +40,7 @@ impl DnsResolver {
3940
let (event_tx, event_rx) = channel();
4041
let cancellation_token = CancellationToken::new();
4142
let dns_task = DnsTask {
43+
active_tasks: Default::default(),
4244
resolver,
4345
request_rx,
4446
event_tx,
@@ -81,6 +83,14 @@ impl DnsTask {
8183
while let Some(dns_request) = self.request_rx.recv().await {
8284
let DnsRequest { handle, hostname } = dns_request;
8385

86+
/* abort previous dns task */
87+
let previous_task = self.active_tasks.remove(&handle);
88+
if let Some(task) = previous_task {
89+
if !task.is_finished() {
90+
task.abort();
91+
}
92+
}
93+
8494
self.event_tx
8595
.send(DnsEvent::Resolving(handle))
8696
.expect("channel closed");
@@ -90,7 +100,7 @@ impl DnsTask {
90100
let resolver = self.resolver.clone();
91101
let cancellation_token = self.cancellation_token.clone();
92102

93-
tokio::task::spawn_local(async move {
103+
let task = tokio::task::spawn_local(async move {
94104
tokio::select! {
95105
ips = resolver.lookup_ip(&hostname) => {
96106
let ips = ips.map(|ips| ips.iter().collect::<Vec<_>>());
@@ -101,6 +111,7 @@ impl DnsTask {
101111
_ = cancellation_token.cancelled() => {},
102112
}
103113
});
114+
self.active_tasks.insert(handle, task);
104115
}
105116
}
106117
}

0 commit comments

Comments
 (0)