Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Commit 6bc7e14

Browse files
committed
peerset disconnects are all instantaneous
1 parent 21033d7 commit 6bc7e14

File tree

1 file changed

+51
-26
lines changed

1 file changed

+51
-26
lines changed

core/peerset/src/lib.rs

Lines changed: 51 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)