@@ -248,20 +248,30 @@ impl Peerset {
248248 return ;
249249 }
250250
251- match self . data . out_slots . add_peer ( peer_id. clone ( ) , SlotType :: Reserved ) {
252- Ok ( _) => {
253- self . data . discovered . remove_peer ( & peer_id) ;
254- self . message_queue . push_back ( Message :: Connect ( peer_id) ) ;
255- } ,
256- Err ( SlotError :: AlreadyConnected ( _) ) => {
257- return ;
258- }
259- Err ( SlotError :: MaxConnections ( _) ) => {
260- self . data . discovered . add_peer ( peer_id, SlotType :: Reserved ) ;
261- }
262- Err ( SlotError :: DemandReroute { disconnect, ..} ) => {
263- self . message_queue . push_back ( Message :: Drop ( disconnect) ) ;
264- self . data . discovered . add_peer ( peer_id, SlotType :: Reserved ) ;
251+ loop {
252+ match self . data . out_slots . add_peer ( peer_id. clone ( ) , SlotType :: Reserved ) {
253+ Ok ( _) => {
254+ // reserved node may have been previously stored as normal node in discovered list
255+ // let's remove it
256+ self . data . discovered . remove_peer ( & peer_id) ;
257+
258+ // notify that connection has been made
259+ self . message_queue . push_back ( Message :: Connect ( peer_id) ) ;
260+ return ;
261+ } ,
262+ Err ( SlotError :: AlreadyConnected ( _) ) => {
263+ return ;
264+ }
265+ Err ( SlotError :: MaxConnections ( _) ) => {
266+ self . data . discovered . add_peer ( peer_id, SlotType :: Reserved ) ;
267+ return ;
268+ }
269+ Err ( SlotError :: DemandReroute { disconnect, ..} ) => {
270+ // disconnect not reserved node
271+ self . data . out_slots . clear_slot ( & disconnect) ;
272+ self . message_queue . push_back ( Message :: Drop ( disconnect) ) ;
273+ // on the next loop iteration we should connect to the peer
274+ }
265275 }
266276 }
267277 }
@@ -312,9 +322,13 @@ impl Peerset {
312322 break ;
313323 } ,
314324 Err ( SlotError :: DemandReroute { disconnect, .. } ) => {
325+ // disconnect not reserved node
326+ self . data . out_slots . clear_slot ( & disconnect) ;
315327 self . message_queue . push_back ( Message :: Drop ( disconnect) ) ;
328+
329+ // add reserved node back to the discovered list, so it is
330+ // processed again in the future
316331 self . data . discovered . add_peer ( peer_id, slot_type) ;
317- break ;
318332 }
319333 }
320334 }
@@ -350,17 +364,28 @@ impl Peerset {
350364 SlotType :: Common
351365 } ;
352366
353- match self . data . in_slots . add_peer ( peer_id. clone ( ) , slot_type) {
354- Ok ( _) => {
355- self . data . discovered . remove_peer ( & peer_id) ;
356- self . message_queue . push_back ( Message :: Accept ( index) ) ;
357- } ,
358- Err ( SlotError :: MaxConnections ( peer_id) ) => {
359- self . data . discovered . add_peer ( peer_id, slot_type) ;
360- self . message_queue . push_back ( Message :: Reject ( index) ) ;
361- } ,
362- _ => {
363- self . message_queue . push_back ( Message :: Reject ( index) ) ;
367+ loop {
368+ match self . data . in_slots . add_peer ( peer_id. clone ( ) , slot_type) {
369+ Ok ( _) => {
370+ self . data . discovered . remove_peer ( & peer_id) ;
371+ self . message_queue . push_back ( Message :: Accept ( index) ) ;
372+ return ;
373+ } ,
374+ Err ( SlotError :: MaxConnections ( peer_id) ) => {
375+ self . data . discovered . add_peer ( peer_id, slot_type) ;
376+ self . message_queue . push_back ( Message :: Reject ( index) ) ;
377+ return ;
378+ } ,
379+ Err ( SlotError :: AlreadyConnected ( _) ) => {
380+ self . message_queue . push_back ( Message :: Reject ( index) ) ;
381+ return ;
382+ } ,
383+ Err ( SlotError :: DemandReroute { disconnect, .. } ) => {
384+ // disconnect not reserved node
385+ self . data . in_slots . clear_slot ( & disconnect) ;
386+ self . message_queue . push_back ( Message :: Drop ( disconnect) ) ;
387+ // on the next loop iteration we should accept the connection
388+ } ,
364389 }
365390 }
366391 }
0 commit comments