Merge pull request #2238 from matrix-org/erikj/faster_push_rules

Speed up calculating push rules
This commit is contained in:
Erik Johnston 2017-05-22 15:12:34 +01:00 committed by GitHub
commit ccd62415ac
1 changed files with 23 additions and 9 deletions

View File

@ -200,6 +200,13 @@ class RulesForRoom(object):
# not update the cache with it. # not update the cache with it.
self.sequence = 0 self.sequence = 0
# A cache of user_ids that we *know* aren't interesting, e.g. user_ids
# owned by AS's, or remote users, etc. (I.e. users we will never need to
# calculate push for)
# These never need to be invalidated as we will never set up push for
# them.
self.uninteresting_user_set = set()
# We need to be clever on the invalidating caches callbacks, as # We need to be clever on the invalidating caches callbacks, as
# otherwise the invalidation callback holds a reference to the object, # otherwise the invalidation callback holds a reference to the object,
# potentially causing it to leak. # potentially causing it to leak.
@ -231,10 +238,24 @@ class RulesForRoom(object):
# Loop through to see which member events we've seen and have rules # Loop through to see which member events we've seen and have rules
# for and which we need to fetch # for and which we need to fetch
for key, event_id in current_state_ids.iteritems(): for key in current_state_ids:
if key[0] != EventTypes.Member: typ, user_id = key
if typ != EventTypes.Member:
continue continue
if user_id in self.uninteresting_user_set:
continue
if not self.is_mine_id(user_id):
self.uninteresting_user_set.add(user_id)
continue
if self.store.get_if_app_services_interested_in_user(user_id):
self.uninteresting_user_set.add(user_id)
continue
event_id = current_state_ids[key]
res = self.member_map.get(event_id, None) res = self.member_map.get(event_id, None)
if res: if res:
user_id, state = res user_id, state = res
@ -244,13 +265,6 @@ class RulesForRoom(object):
ret_rules_by_user[user_id] = rules ret_rules_by_user[user_id] = rules
continue continue
user_id = key[1]
if not self.is_mine_id(user_id):
continue
if self.store.get_if_app_services_interested_in_user(user_id):
continue
# If a user has left a room we remove their push rule. If they # If a user has left a room we remove their push rule. If they
# joined then we readd it later in _update_rules_with_member_event_ids # joined then we readd it later in _update_rules_with_member_event_ids
ret_rules_by_user.pop(user_id, None) ret_rules_by_user.pop(user_id, None)