Only notify the target of a membership event

Naughty, but should be a big speedup in large rooms

Changelog
anoa/redirect_instances
David Robertson 2023-02-02 15:28:32 +00:00
parent 769406378c
commit a7fa951876
No known key found for this signature in database
GPG Key ID: 903ECE108A39DEDD
2 changed files with 20 additions and 8 deletions

1
changelog.d/14971.misc Normal file
View File

@ -0,0 +1 @@
Improve performance of joining and leaving large rooms with many local users.

View File

@ -129,15 +129,26 @@ class BulkPushRuleEvaluator:
Returns: Returns:
Mapping of user ID to their push rules. Mapping of user ID to their push rules.
""" """
# We get the users who may need to be notified by first fetching the # If this is a membership event, only calculate push rules for the target.
# local users currently in the room, finding those that have push rules, # While it's possible for users to configure push rules to respond to such an
# and *then* checking which users are actually allowed to see the event. # event, in practise nobody does this. At the cost of violating the spec a
# # little, we can skip fetching a huge number of push rules in large rooms.
# The alternative is to first fetch all users that were joined at the # This helps make joins and leaves faster.
# event, but that requires fetching the full state at the event, which if event.type == EventTypes.Member:
# may be expensive for large rooms with few local users. if self.hs.is_mine_id(event.state_key):
local_users = [event.state_key]
else:
return {}
else:
# We get the users who may need to be notified by first fetching the
# local users currently in the room, finding those that have push rules,
# and *then* checking which users are actually allowed to see the event.
#
# The alternative is to first fetch all users that were joined at the
# event, but that requires fetching the full state at the event, which
# may be expensive for large rooms with few local users.
local_users = await self.store.get_local_users_in_room(event.room_id) local_users = await self.store.get_local_users_in_room(event.room_id)
# Filter out appservice users. # Filter out appservice users.
local_users = [ local_users = [