1
- use std:: net:: IpAddr ;
1
+ use std:: { collections :: HashMap , net:: IpAddr } ;
2
2
3
3
use local_channel:: mpsc:: { channel, Receiver , Sender } ;
4
4
use tokio:: task:: { spawn_local, JoinHandle } ;
@@ -30,6 +30,7 @@ struct DnsTask {
30
30
request_rx : Receiver < DnsRequest > ,
31
31
event_tx : Sender < DnsEvent > ,
32
32
cancellation_token : CancellationToken ,
33
+ active_tasks : HashMap < ClientHandle , JoinHandle < ( ) > > ,
33
34
}
34
35
35
36
impl DnsResolver {
@@ -39,6 +40,7 @@ impl DnsResolver {
39
40
let ( event_tx, event_rx) = channel ( ) ;
40
41
let cancellation_token = CancellationToken :: new ( ) ;
41
42
let dns_task = DnsTask {
43
+ active_tasks : Default :: default ( ) ,
42
44
resolver,
43
45
request_rx,
44
46
event_tx,
@@ -81,6 +83,14 @@ impl DnsTask {
81
83
while let Some ( dns_request) = self . request_rx . recv ( ) . await {
82
84
let DnsRequest { handle, hostname } = dns_request;
83
85
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
+
84
94
self . event_tx
85
95
. send ( DnsEvent :: Resolving ( handle) )
86
96
. expect ( "channel closed" ) ;
@@ -90,7 +100,7 @@ impl DnsTask {
90
100
let resolver = self . resolver . clone ( ) ;
91
101
let cancellation_token = self . cancellation_token . clone ( ) ;
92
102
93
- tokio:: task:: spawn_local ( async move {
103
+ let task = tokio:: task:: spawn_local ( async move {
94
104
tokio:: select! {
95
105
ips = resolver. lookup_ip( & hostname) => {
96
106
let ips = ips. map( |ips| ips. iter( ) . collect:: <Vec <_>>( ) ) ;
@@ -101,6 +111,7 @@ impl DnsTask {
101
111
_ = cancellation_token. cancelled( ) => { } ,
102
112
}
103
113
} ) ;
114
+ self . active_tasks . insert ( handle, task) ;
104
115
}
105
116
}
106
117
}
0 commit comments