Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(relay): propagate errors to Transport::{listen_on,dial} #4745

Merged
merged 32 commits into from
Oct 31, 2023

Conversation

thomaseizinger
Copy link
Contributor

Description

To make a reservation with a relay, a user calls Swarm::listen_on with an address of the relay, suffixed with a /p2pcircuit protocol. Similarly, to establish a circuit to another peer, a user needs to call Swarm::dial with such an address. Upon success, the Swarm then issues a SwarmEvent::NewListenAddr event in case of a successful reservation or a SwarmEvent::ConnectionEstablished in case of a successful connect.

The story is different for errors. Somewhat counterintuitively, the actual reason of an error during these operations are only reported as relay::Events without a direct correlation to the user's Swarm::listen_on or Swarm::dial calls.

With this PR, we send these errors back "into" the Transport and report them as SwarmEvent::ListenerClosed or SwarmEvent::OutgoingConnectionError. This is conceptually more correct. Additionally, by sending these errors back to the transport, we no longer use ConnectionHandlerEvent::Close which entirely closes the underlying relay connection. In case the connection is not used for something else, it will be closed by the keep-alive algorithm.

Resolves: #4717.
Related: #3591.
Related: #4718.

Notes & open questions

Change checklist

  • I have performed a self-review of my own code
  • I have made corresponding changes to the documentation
  • I have added tests that prove my fix is effective or that my feature works
  • A changelog entry has been made in the appropriate crates

@thomaseizinger thomaseizinger added this to the v0.53.0 milestone Oct 27, 2023
@mergify

This comment was marked as resolved.

@mergify

This comment was marked as resolved.

@mergify
Copy link
Contributor

mergify bot commented Oct 30, 2023

This pull request has merge conflicts. Could you please resolve them @thomaseizinger? 🙏

Copy link
Member

@mxinden mxinden left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall looking good to me.

protocols/relay/CHANGELOG.md Outdated Show resolved Hide resolved
protocols/relay/src/priv_client/handler.rs Outdated Show resolved Hide resolved
protocols/relay/src/priv_client/handler.rs Outdated Show resolved Hide resolved
protocols/relay/src/priv_client/handler.rs Outdated Show resolved Hide resolved
@mergify mergify bot merged commit 6a8cef5 into master Oct 31, 2023
71 checks passed
@mergify mergify bot deleted the refactor/relay-client-error branch October 31, 2023 20:53
mergify bot pushed a commit that referenced this pull request Nov 2, 2023
This PR implements the long-awaited design of disallowing `ConnectionHandler`s to close entire connections. Instead, users should close connections via `ToSwarm::CloseConnection` from a `NetworkBehaviour` or - even better - from the `Swarm` via `close_connection`. A `NetworkBehaviour` also does not have a "full" view onto how a connection is used but at least it can correlate whether it created the connection via the `ConnectionId`. In general, the more modular and friendly approach is to stop "using" a connection if a particular protocol no longer needs it. As a result of the keep-alive algorithm, such a connection is then closed automatically.

Depends-on: #4745.
Depends-on: #4718.
Depends-on: #4749.
Related: #3353.
Related: #4714.
Resolves: #3591.

Pull-Request: #4755.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Remove usage of ConnectionHandlerEvent::Close from libp2p_relay::client
2 participants