mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-06-30 18:21:33 +00:00
Multiple connections per peer (#1440)
* Allow multiple connections per peer in libp2p-core. Instead of trying to enforce a single connection per peer, which involves quite a bit of additional complexity e.g. to prioritise simultaneously opened connections and can have other undesirable consequences [1], we now make multiple connections per peer a feature. The gist of these changes is as follows: The concept of a "node" with an implicit 1-1 correspondence to a connection has been replaced with the "first-class" concept of a "connection". The code from `src/nodes` has moved (with varying degrees of modification) to `src/connection`. A `HandledNode` has become a `Connection`, a `NodeHandler` a `ConnectionHandler`, the `CollectionStream` was the basis for the new `connection::Pool`, and so forth. Conceptually, a `Network` contains a `connection::Pool` which in turn internally employs the `connection::Manager` for handling the background `connection::manager::Task`s, one per connection, as before. These are all considered implementation details. On the public API, `Peer`s are managed as before through the `Network`, except now the API has changed with the shift of focus to (potentially multiple) connections per peer. The `NetworkEvent`s have accordingly also undergone changes. The Swarm APIs remain largely unchanged, except for the fact that `inject_replaced` is no longer called. It may now practically happen that multiple `ProtocolsHandler`s are associated with a single `NetworkBehaviour`, one per connection. If implementations of `NetworkBehaviour` rely somehow on communicating with exactly one `ProtocolsHandler`, this may cause issues, but it is unlikely. [1]: https://github.com/paritytech/substrate/issues/4272 * Fix intra-rustdoc links. * Update core/src/connection/pool.rs Co-Authored-By: Max Inden <mail@max-inden.de> * Address some review feedback and fix doc links. * Allow responses to be sent on the same connection. * Remove unnecessary remainders of inject_replaced. * Update swarm/src/behaviour.rs Co-Authored-By: Pierre Krieger <pierre.krieger1708@gmail.com> * Update swarm/src/lib.rs Co-Authored-By: Pierre Krieger <pierre.krieger1708@gmail.com> * Update core/src/connection/manager.rs Co-Authored-By: Pierre Krieger <pierre.krieger1708@gmail.com> * Update core/src/connection/manager.rs Co-Authored-By: Pierre Krieger <pierre.krieger1708@gmail.com> * Update core/src/connection/pool.rs Co-Authored-By: Pierre Krieger <pierre.krieger1708@gmail.com> * Incorporate more review feedback. * Move module declaration below imports. * Update core/src/connection/manager.rs Co-Authored-By: Toralf Wittner <tw@dtex.org> * Update core/src/connection/manager.rs Co-Authored-By: Toralf Wittner <tw@dtex.org> * Simplify as per review. * Fix rustoc link. * Add try_notify_handler and simplify. * Relocate DialingConnection and DialingAttempt. For better visibility constraints. * Small cleanup. * Small cleanup. More robust EstablishedConnectionIter. * Clarify semantics of `DialingPeer::connect`. * Don't call inject_disconnected on InvalidPeerId. To preserve the previous behavior and ensure calls to `inject_disconnected` are always paired with calls to `inject_connected`. * Provide public ConnectionId constructor. Mainly needed for testing purposes, e.g. in substrate. * Move the established connection limit check to the right place. * Clean up connection error handling. Separate connection errors into those occuring during connection setup or upon rejecting a newly established connection (the `PendingConnectionError`) and those errors occurring on previously established connections, i.e. for which a `ConnectionEstablished` event has been emitted by the connection pool earlier. * Revert change in log level and clarify an invariant. * Remove inject_replaced entirely. * Allow notifying all connection handlers. Thereby simplify by introducing a new enum `NotifyHandler`, used with a single constructor `NetworkBehaviourAction::NotifyHandler`. * Finishing touches. Small API simplifications and code deduplication. Some more useful debug logging. Co-authored-by: Max Inden <mail@max-inden.de> Co-authored-by: Pierre Krieger <pierre.krieger1708@gmail.com> Co-authored-by: Toralf Wittner <tw@dtex.org>
This commit is contained in:
@ -100,7 +100,7 @@ mod tests {
|
||||
gs.events
|
||||
.iter()
|
||||
.fold(vec![], |mut collected_subscriptions, e| match e {
|
||||
NetworkBehaviourAction::SendEvent { peer_id: _, event } => {
|
||||
NetworkBehaviourAction::NotifyHandler { event, .. } => {
|
||||
for s in &event.subscriptions {
|
||||
match s.action {
|
||||
GossipsubSubscriptionAction::Subscribe => {
|
||||
@ -163,7 +163,7 @@ mod tests {
|
||||
gs.events
|
||||
.iter()
|
||||
.fold(vec![], |mut collected_subscriptions, e| match e {
|
||||
NetworkBehaviourAction::SendEvent { peer_id: _, event } => {
|
||||
NetworkBehaviourAction::NotifyHandler { event, .. } => {
|
||||
for s in &event.subscriptions {
|
||||
match s.action {
|
||||
GossipsubSubscriptionAction::Unsubscribe => {
|
||||
@ -328,7 +328,7 @@ mod tests {
|
||||
.events
|
||||
.iter()
|
||||
.fold(vec![], |mut collected_publish, e| match e {
|
||||
NetworkBehaviourAction::SendEvent { peer_id: _, event } => {
|
||||
NetworkBehaviourAction::NotifyHandler { event, .. } => {
|
||||
for s in &event.messages {
|
||||
collected_publish.push(s.clone());
|
||||
}
|
||||
@ -394,7 +394,7 @@ mod tests {
|
||||
.events
|
||||
.iter()
|
||||
.fold(vec![], |mut collected_publish, e| match e {
|
||||
NetworkBehaviourAction::SendEvent { peer_id: _, event } => {
|
||||
NetworkBehaviourAction::NotifyHandler { event, .. } => {
|
||||
for s in &event.messages {
|
||||
collected_publish.push(s.clone());
|
||||
}
|
||||
@ -437,10 +437,7 @@ mod tests {
|
||||
.events
|
||||
.iter()
|
||||
.filter(|e| match e {
|
||||
NetworkBehaviourAction::SendEvent {
|
||||
peer_id: _,
|
||||
event: _,
|
||||
} => true,
|
||||
NetworkBehaviourAction::NotifyHandler { .. } => true,
|
||||
_ => false,
|
||||
})
|
||||
.collect();
|
||||
@ -448,7 +445,7 @@ mod tests {
|
||||
// check that there are two subscriptions sent to each peer
|
||||
for sevent in send_events.clone() {
|
||||
match sevent {
|
||||
NetworkBehaviourAction::SendEvent { peer_id: _, event } => {
|
||||
NetworkBehaviourAction::NotifyHandler { event, .. } => {
|
||||
assert!(
|
||||
event.subscriptions.len() == 2,
|
||||
"There should be two subscriptions sent to each peer (1 for each topic)."
|
||||
@ -625,7 +622,7 @@ mod tests {
|
||||
.events
|
||||
.iter()
|
||||
.fold(vec![], |mut collected_messages, e| match e {
|
||||
NetworkBehaviourAction::SendEvent { peer_id: _, event } => {
|
||||
NetworkBehaviourAction::NotifyHandler { event, .. } => {
|
||||
for c in &event.messages {
|
||||
collected_messages.push(c.clone())
|
||||
}
|
||||
@ -664,7 +661,7 @@ mod tests {
|
||||
|
||||
// is the message is being sent?
|
||||
let message_exists = gs.events.iter().any(|e| match e {
|
||||
NetworkBehaviourAction::SendEvent { peer_id: _, event } => {
|
||||
NetworkBehaviourAction::NotifyHandler { event, .. } => {
|
||||
event.messages.iter().any(|msg| id(msg) == msg_id)
|
||||
}
|
||||
_ => false,
|
||||
|
Reference in New Issue
Block a user