@@ -19,9 +19,9 @@ use commonware_runtime::{
1919 BufferPooler , Clock , ContextCell , Handle , Metrics , Network , Resolver , SinkOf , Spawner ,
2020 StreamOf ,
2121} ;
22- use commonware_utils:: futures:: Pool ;
23- use futures:: future:: { self , Either } ;
2422use commonware_stream:: encrypted:: { dial, Config as StreamConfig } ;
23+ use commonware_utils:: channel:: oneshot;
24+ use futures:: future:: { self , Either } ;
2525use rand:: seq:: SliceRandom ;
2626use rand_core:: CryptoRngCore ;
2727use std:: time:: { Duration , SystemTime } ;
@@ -32,10 +32,24 @@ type SupervisorMailbox<E, C> =
3232 Mailbox < spawner:: Message < SinkOf < E > , StreamOf < E > , <C as Signer >:: PublicKey > > ;
3333
3434enum TrackerQuery < C : PublicKey > {
35+ Dialable ( oneshot:: Receiver < Dialable < C > > ) ,
36+ Dial ( oneshot:: Receiver < Option < Reservation < C > > > ) ,
37+ }
38+
39+ enum TrackerReply < C : PublicKey > {
3540 Dialable ( Dialable < C > ) ,
3641 Dial ( Option < Reservation < C > > ) ,
3742}
3843
44+ impl < C : PublicKey > TrackerQuery < C > {
45+ async fn recv ( & mut self ) -> TrackerReply < C > {
46+ match self {
47+ Self :: Dialable ( receiver) => TrackerReply :: Dialable ( receiver. await . unwrap_or_default ( ) ) ,
48+ Self :: Dial ( receiver) => TrackerReply :: Dial ( receiver. await . ok ( ) . flatten ( ) ) ,
49+ }
50+ }
51+ }
52+
3953/// Configuration for the dialer actor.
4054pub struct Config < C : Signer > {
4155 /// Configuration for the stream.
@@ -173,42 +187,41 @@ impl<
173187 mut supervisor : SupervisorMailbox < E , C > ,
174188 ) {
175189 let mut dial_deadline = self . context . current ( ) ;
176- let mut queries = Pool :: default ( ) ;
177- let mut query_pending = false ;
190+ let mut query: Option < TrackerQuery < C :: PublicKey > > = None ;
178191 select_loop ! {
179192 self . context,
180193 on_start => {
181- let wait_for_deadline = if query_pending {
194+ let wait_for_deadline = if query . is_some ( ) {
182195 Either :: Left ( future:: pending( ) )
183196 } else {
184197 Either :: Right ( self . context. sleep_until( dial_deadline) )
185198 } ;
199+ let wait_for_query = match & mut query {
200+ Some ( query) => Either :: Left ( query. recv( ) ) ,
201+ None => Either :: Right ( future:: pending( ) ) ,
202+ } ;
186203 } ,
187204 on_stopped => {
188205 debug!( "context shutdown, stopping dialer" ) ;
189206 } ,
190207 _ = wait_for_deadline => {
191208 let now = self . context. current( ) ;
192209 if self . queue. is_empty( ) {
193- let tracker = tracker. clone( ) ;
194- queries. push( async move { TrackerQuery :: Dialable ( tracker. dialable( ) . await ) } ) ;
195- query_pending = true ;
210+ query = Some ( TrackerQuery :: Dialable ( tracker. dialable( ) ) ) ;
196211 continue ;
197212 }
198213
199214 if let Some ( peer) = self . queue. pop( ) {
200- let tracker = tracker. clone( ) ;
201- queries. push( async move { TrackerQuery :: Dial ( tracker. dial( peer) . await ) } ) ;
202- query_pending = true ;
215+ query = Some ( TrackerQuery :: Dial ( tracker. dial( peer) ) ) ;
203216 } else {
204217 dial_deadline = self . empty_queue_deadline( now, None ) ;
205218 }
206219 } ,
207- query = queries . next_completed ( ) => {
208- query_pending = false ;
220+ reply = wait_for_query => {
221+ query = None ;
209222 let now = self . context. current( ) ;
210- match query {
211- TrackerQuery :: Dialable ( dialable) => {
223+ match reply {
224+ TrackerReply :: Dialable ( dialable) => {
212225 self . queue = dialable. peers;
213226 self . queue. shuffle( self . context. as_mut( ) ) ;
214227 dial_deadline = if self . queue. is_empty( ) {
@@ -217,7 +230,7 @@ impl<
217230 now
218231 } ;
219232 }
220- TrackerQuery :: Dial ( result) => {
233+ TrackerReply :: Dial ( result) => {
221234 if let Some ( reservation) = result {
222235 self . dial_peer( reservation, & mut supervisor) ;
223236 dial_deadline = now + self . dial_frequency;
0 commit comments