summary refs log tree commit diff
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2017-05-19 16:51:05 +0100
committerErik Johnston <erik@matrix.org>2017-05-19 16:51:05 +0100
commit270e1c904a53c69512eec2d3818718d64efa7649 (patch)
treeee3f7598531eed39865f3f25a33b195b6b558958
parentMerge pull request #2236 from matrix-org/erikj/invalidation (diff)
downloadsynapse-270e1c904a53c69512eec2d3818718d64efa7649.tar.xz
Speed up calculating push rules
-rw-r--r--synapse/push/bulk_push_rule_evaluator.py27
1 files changed, 19 insertions, 8 deletions
diff --git a/synapse/push/bulk_push_rule_evaluator.py b/synapse/push/bulk_push_rule_evaluator.py
index 760d567ca1..3da684c6b1 100644
--- a/synapse/push/bulk_push_rule_evaluator.py
+++ b/synapse/push/bulk_push_rule_evaluator.py
@@ -200,6 +200,10 @@ class RulesForRoom(object):
         # not update the cache with it.
         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.
+        self.uninteresting_user_set = set()
+
         # We need to be clever on the invalidating caches callbacks, as
         # otherwise the invalidation callback holds a reference to the object,
         # potentially causing it to leak.
@@ -231,10 +235,24 @@ class RulesForRoom(object):
 
             # Loop through to see which member events we've seen and have rules
             # 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:
                     continue
 
+                user_id = key[1]
+                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)
                 if res:
                     user_id, state = res
@@ -244,13 +262,6 @@ class RulesForRoom(object):
                             ret_rules_by_user[user_id] = rules
                     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
                 # joined then we readd it later in _update_rules_with_member_event_ids
                 ret_rules_by_user.pop(user_id, None)