Add a heartbeat to detect hung connections #1101
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
ripple-lib now keeps a constant heartbeat to detect broken/hung connections. Every minute, a "ping" command is sent by the RippleAPI connection instance. If that fails, the connection is disconnected so that the consumer can reconnect.
I was able to test this by dropping the timeout down to below the mocked "ping" response, to simulate a hung connection receiving no responses from the server. It's not perfect, but it's a fair enough representation, especially considering how tricky it is to test server disconnect/reconnect logic.
Questions
Alternative Designs / Considerations
For a while I worked to do this in some clever way using the ledgerClosed stream that we already connect to (so no extra ping requests needed). But ultimately it felt more maintainable/reliable to just add a true heartbeat that wouldn't have to rely on the behavior of that stream's implementation on both the server and the client.