summary refs log tree commit diff
diff options
context:
space:
mode:
authorErik Johnston <erikj@jki.re>2017-05-22 15:12:34 +0100
committerGitHub <noreply@github.com>2017-05-22 15:12:34 +0100
commitccd62415ac2f89fa651bfec7b2577314e2bd3639 (patch)
treec3021914833234796312b5410a47dca1ed3b4ed0
parentMerge pull request #2236 from matrix-org/erikj/invalidation (diff)
parentComment (diff)
downloadsynapse-ccd62415ac2f89fa651bfec7b2577314e2bd3639.tar.xz
Merge pull request #2238 from matrix-org/erikj/faster_push_rules
Speed up calculating push rules
-rw-r--r--synapse/push/bulk_push_rule_evaluator.py32
1 files changed, 23 insertions, 9 deletions
diff --git a/synapse/push/bulk_push_rule_evaluator.py b/synapse/push/bulk_push_rule_evaluator.py
index 760d567ca1..8443e4b05c 100644
--- a/synapse/push/bulk_push_rule_evaluator.py
+++ b/synapse/push/bulk_push_rule_evaluator.py
@@ -200,6 +200,13 @@ 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. (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
         # otherwise the invalidation callback holds a reference to the object,
         # 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
             # for and which we need to fetch
-            for key, event_id in current_state_ids.iteritems():
-                if key[0] != EventTypes.Member:
+            for key in current_state_ids:
+                typ, user_id = key
+                if typ != EventTypes.Member:
+                    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)
                 if res:
                     user_id, state = res
@@ -244,13 +265,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)