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 mobile app dispatcher performance #99647

Merged
merged 1 commit into from Sep 5, 2023
Merged

Conversation

bdraco
Copy link
Member

@bdraco bdraco commented Sep 5, 2023

Proposed change

The mobile_app would set up a dispatcher to listen for updates on every entity and reject the ones that were not for the unique id that it was interested in. This generated O(n*devices) callbacks which meant each new mobile app integration made the performance significantly worse which was causing the event loop to stall when there were a large number of mobile app users.

Instead we now register for a signal per unique id which generates O(1) callback per sensor update.

Type of change

  • Dependency upgrade
  • Bugfix (non-breaking change which fixes an issue)
  • New integration (thank you!)
  • New feature (which adds functionality to an existing integration)
  • Deprecation (breaking change to happen in the future)
  • Breaking change (fix/feature causing existing functionality to break)
  • Code quality improvements to existing code or addition of tests

Additional information

  • This PR fixes or closes issue: fixes #
  • This PR is related to issue:
  • Link to documentation pull request:

Checklist

  • The code change is tested and works locally.
  • Local tests pass. Your PR cannot be merged unless tests pass
  • There is no commented out code in this PR.
  • I have followed the development checklist
  • I have followed the perfect PR recommendations
  • The code has been formatted using Black (black --fast homeassistant tests)
  • Tests have been added to verify that the new code works.

If user exposed functionality or configuration variables are added/changed:

If the code communicates with devices, web services, or third-party tools:

  • The manifest file has all fields filled out correctly.
    Updated and included derived files by running: python3 -m script.hassfest.
  • New or updated dependencies have been added to requirements_all.txt.
    Updated by running python3 -m script.gen_requirements_all.
  • For the updated dependencies - a link to the changelog, or at minimum a diff between library versions is added to the PR description.
  • Untested files have been added to .coveragerc.

To help with the load of incoming pull requests:

The mobile_app would setup a dispatcher to listener for updates on
every entity and reject the ones that were not for the unique id
that it was intrested in.

Instead we now register for a signal per unique id since we were
previously generating O(entities*sensors*devices) callbacks which
was causing the event loop to stall when there were a large
number of mobile app users.
@home-assistant
Copy link

home-assistant bot commented Sep 5, 2023

Hey there @home-assistant/core, mind taking a look at this pull request as it has been labeled with an integration (mobile_app) you are listed as a code owner for? Thanks!

Code owner commands

Code owners of mobile_app can trigger bot actions by commenting:

  • @home-assistant close Closes the pull request.
  • @home-assistant rename Awesome new title Renames the pull request.
  • @home-assistant reopen Reopen the pull request.
  • @home-assistant unassign mobile_app Removes the current integration label and assignees on the pull request, add the integration domain after the command.

@bdraco bdraco changed the title Fix mobile app thundering heard Fix mobile app dispatcher performance Sep 5, 2023
@bdraco
Copy link
Member Author

bdraco commented Sep 5, 2023

This causes enough callbacks to generate an asyncio debug warning so I tagged it

@bdraco bdraco marked this pull request as ready for review September 5, 2023 00:24
@bdraco bdraco requested a review from a team as a code owner September 5, 2023 00:24
@bdraco
Copy link
Member Author

bdraco commented Sep 5, 2023

I've been looking for this one a for a long time but was just lucky enough for it to happen when I was profiling today

@balloob balloob merged commit fed1cab into dev Sep 5, 2023
21 checks passed
@balloob balloob deleted the mobile_app_thundering_herd branch September 5, 2023 00:56
@balloob
Copy link
Member

balloob commented Sep 5, 2023

Nice catch!

bramkragten pushed a commit that referenced this pull request Sep 5, 2023
Fix mobile app thundering heard

The mobile_app would setup a dispatcher to listener for updates on
every entity and reject the ones that were not for the unique id
that it was intrested in.

Instead we now register for a signal per unique id since we were
previously generating O(entities*sensors*devices) callbacks which
was causing the event loop to stall when there were a large
number of mobile app users.
@github-actions github-actions bot locked and limited conversation to collaborators Sep 6, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants