mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-06-22 14:21:33 +00:00
core/: Concurrent dial attempts (#2248)
Concurrently dial address candidates within a single dial attempt. Main motivation for this feature is to increase success rate on hole punching (see https://github.com/libp2p/rust-libp2p/issues/1896#issuecomment-885894496 for details). Though, as a nice side effect, as one would expect, it does improve connection establishment time. Cleanups and fixes done along the way: - Merge `pool.rs` and `manager.rs`. - Instead of manually implementing state machines in `task.rs` use `async/await`. - Fix bug where `NetworkBehaviour::inject_connection_closed` is called without a previous `NetworkBehaviour::inject_connection_established` (see https://github.com/libp2p/rust-libp2p/issues/2242). - Return handler to behaviour on incoming connection limit error. Missed in https://github.com/libp2p/rust-libp2p/issues/2242.
This commit is contained in:
@ -606,6 +606,7 @@ where
|
||||
peer: &PeerId,
|
||||
conn: &ConnectionId,
|
||||
endpoint: &ConnectedPoint,
|
||||
_errors: Option<&Vec<Multiaddr>>,
|
||||
) {
|
||||
let address = match endpoint {
|
||||
ConnectedPoint::Dialer { address } => Some(address.clone()),
|
||||
@ -666,23 +667,30 @@ where
|
||||
self.connected.remove(peer);
|
||||
}
|
||||
|
||||
fn inject_dial_failure(&mut self, peer: &PeerId, _: Self::ProtocolsHandler, _: DialError) {
|
||||
// If there are pending outgoing requests when a dial failure occurs,
|
||||
// it is implied that we are not connected to the peer, since pending
|
||||
// outgoing requests are drained when a connection is established and
|
||||
// only created when a peer is not connected when a request is made.
|
||||
// Thus these requests must be considered failed, even if there is
|
||||
// another, concurrent dialing attempt ongoing.
|
||||
if let Some(pending) = self.pending_outbound_requests.remove(peer) {
|
||||
for request in pending {
|
||||
self.pending_events
|
||||
.push_back(NetworkBehaviourAction::GenerateEvent(
|
||||
RequestResponseEvent::OutboundFailure {
|
||||
peer: *peer,
|
||||
request_id: request.request_id,
|
||||
error: OutboundFailure::DialFailure,
|
||||
},
|
||||
));
|
||||
fn inject_dial_failure(
|
||||
&mut self,
|
||||
peer: Option<PeerId>,
|
||||
_: Self::ProtocolsHandler,
|
||||
_: &DialError,
|
||||
) {
|
||||
if let Some(peer) = peer {
|
||||
// If there are pending outgoing requests when a dial failure occurs,
|
||||
// it is implied that we are not connected to the peer, since pending
|
||||
// outgoing requests are drained when a connection is established and
|
||||
// only created when a peer is not connected when a request is made.
|
||||
// Thus these requests must be considered failed, even if there is
|
||||
// another, concurrent dialing attempt ongoing.
|
||||
if let Some(pending) = self.pending_outbound_requests.remove(&peer) {
|
||||
for request in pending {
|
||||
self.pending_events
|
||||
.push_back(NetworkBehaviourAction::GenerateEvent(
|
||||
RequestResponseEvent::OutboundFailure {
|
||||
peer: peer,
|
||||
request_id: request.request_id,
|
||||
error: OutboundFailure::DialFailure,
|
||||
},
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user