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.
When a client is making rapid requests to a device it will often result in
ClientError
exceptions.Upon investigation this is occurring for a two reasons.
Multiple async requests can happen in parallel and overload the comms stack of the device. When this happens, the device will start resetting TCP connections - resulting in the exception. To avoid this we now use a semaphore to throttle requests such that they are limited to 3 at once.
aiohttp will reuse sockets for multiple http requests. It appears a race condition can occur where the HA client attempts to send a TCP payload after the device has closed the connection via a FIN. When this happens the device will immediately reset the connection. To handle this each method now performs retries - in testing this completely mitigated the problem.
In addition to the enhancements above I formatted (black) and linted (flake8) the file.