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

fix(iroh-net): Keep the relay connection alive on read errors #2782

Merged
merged 1 commit into from
Oct 4, 2024

Conversation

flub
Copy link
Contributor

@flub flub commented Oct 3, 2024

Description

When the connection to the relay server fails the read channel will return a read error. At this point the ActiveRelay actor will passively wait until it has been asked to send something again before it will re-establish a connection.

However if the local node has no reason to send anything to the relay server, the connection is never re-established. This is problematic when the relay has remote nodes trying to send to this node. This doubly problematic when the connection is to the home relay: the node just sits there thinking everything is healty and quiet, but no traffic is reaching it.

In a node with active traffic this doesn't really show up, since a send will be triggered quickly for an active connection and the connection with the relay server would be re-established.

The start of the ActiveRelay run loop is the right place for this. A read error triggers the loop to go round, logs a read error already and then re-estagblishes the connection.

This does not keep the relay connection open forever. The mechanism that is cleans up
unused connections to relay servers will still function correctly since this only takes
the time something was last sent to a relay server into account. As long as a connection
with a remote node exists there will be a DISCO ping between the two nodes over the relay
path, so the connection is correctly kept alive. The home relay is exempted from the
relay connection cleanup so is also kept connected, leaving this node available to be
contacted via the relay server. Which is the entire point of this bugfix.

The relay_client.is_connected() call sends a message to the relay Client actor, and relay_client.connect() does that again. Taking the shortcut to only call .connect() however is not better because the logging becomes messier. In the common case there is one roundrip-message to the relay Client actor and this would not improve anyway. The two messages for the case where a reconnect is needed does not occur commonly.

Breaking Changes

None

Notes & open questions

Fixes fishfolk/bones#428

It is rather difficult to test though.

This targets #2781 as base.

Change checklist

  • Self-review.
  • [ ] Documentation updates following the style guide, if relevant.
  • [ ] Tests if relevant.
  • [ ] All breaking changes documented.

Copy link

github-actions bot commented Oct 3, 2024

Documentation for this PR has been generated and is available at: https://n0-computer.github.io/iroh/pr/2782/docs/iroh/

Last updated: 2024-10-04T07:20:29Z

Copy link

github-actions bot commented Oct 3, 2024

Netsim report & logs for this PR have been generated and is available at: LOGS
This report will remain available for 3 days.

Last updated for commit: 892203f

@flub flub force-pushed the flub/relay-actor-active-nodes branch from 8c594f5 to 275b399 Compare October 3, 2024 17:24
@flub flub force-pushed the flub/relay-conn-keep-alive branch from 4ba59df to 64750b4 Compare October 3, 2024 17:25
Copy link
Contributor

@ramfox ramfox left a comment

Choose a reason for hiding this comment

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

lord the relay stuff is so convoluted. Actors on actors on actors.

Looks good, though!

Base automatically changed from flub/relay-actor-active-nodes to main October 4, 2024 07:08
When the connection to the relay server fails the read channel will
return a read error.  At this point the ActiveRelay actor will
passively wait until it has been asked to send something again before
it will re-establish a connection.

However if the local node has no reason to send anything to the relay
server, the connection is never re-established.  This is problematic
when the relay has remote nodes trying to send to this node.  This
doubly problematic when the connection is to the home relay: the node
just sits there thinking everything is healty and quiet, but no
traffic is reaching it.

In a node with active traffic this doesn't really show up, since a
send will be triggered quickly for an active connection and the
connection with the relay server would be re-established.

The start of the ActiveRelay run loop is the right place for this.  A
read error triggers the loop to go round, logs a read error already
and then re-estagblishes the connection.

The relay_client.is_connected() call sends a message to the relay
Client actor, and relay_client.connect() does that again.  Taking the
shortcut to only call .connect() however is not better because the
logging becomes messier.  In the common case there is one
roundrip-message to the relay Client actor and this would not improve
anyway.  The two messages for the case where a reconnect is needed
does not occur commonly.
@flub flub force-pushed the flub/relay-conn-keep-alive branch from 64750b4 to 3eadb89 Compare October 4, 2024 07:18
@flub flub added this pull request to the merge queue Oct 4, 2024
Merged via the queue into main with commit 383f1f9 Oct 4, 2024
27 checks passed
@flub flub deleted the flub/relay-conn-keep-alive branch October 4, 2024 08:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Archived in project
Development

Successfully merging this pull request may close these issues.

Matchmaker eventually stops accepting connections after being deployed
2 participants