summary refs log tree commit diff
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2016-05-31 13:50:19 +0100
committerErik Johnston <erik@matrix.org>2016-05-31 13:50:19 +0100
commite77498c8aa29d9d0f8a0b8cf0e1358eaa0edcc7c (patch)
treeea97d0d4db5283ee122d519d00aac6e9aedab862
parentTime _get_rules (diff)
parentAdd caches to bulk_get_push_rules* (diff)
downloadsynapse-e77498c8aa29d9d0f8a0b8cf0e1358eaa0edcc7c.tar.xz
Merge branch 'erikj/push_rules_cache' of github.com:matrix-org/synapse into erikj/timings
-rw-r--r--synapse/push/bulk_push_rule_evaluator.py9
-rw-r--r--synapse/storage/push_rule.py16
2 files changed, 15 insertions, 10 deletions
diff --git a/synapse/push/bulk_push_rule_evaluator.py b/synapse/push/bulk_push_rule_evaluator.py
index c1a895e28c..bdffc3c90f 100644
--- a/synapse/push/bulk_push_rule_evaluator.py
+++ b/synapse/push/bulk_push_rule_evaluator.py
@@ -30,6 +30,7 @@ logger = logging.getLogger(__name__)
 
 
 def decode_rule_json(rule):
+    rule = dict(rule)
     rule['conditions'] = json.loads(rule['conditions'])
     rule['actions'] = json.loads(rule['actions'])
     return rule
@@ -42,6 +43,8 @@ def _get_rules(room_id, user_ids, store):
     with log_duration("bulk_get_push_rules_enabled"):
         rules_enabled_by_user = yield store.bulk_get_push_rules_enabled(user_ids)
 
+    rules_by_user = {k: v for k, v in rules_by_user.items() if v is not None}
+
     with log_duration("list_with_base_rules"):
         rules_by_user = {
             uid: list_with_base_rules([
@@ -56,14 +59,12 @@ def _get_rules(room_id, user_ids, store):
     # rules the user has disabled, so we need to do this too.
     with log_duration("apply_the_rules_enabled"):
         for uid in user_ids:
-            if uid not in rules_enabled_by_user:
+            user_enabled_map = rules_enabled_by_user.get(uid)
+            if not user_enabled_map:
                 continue
 
-            user_enabled_map = rules_enabled_by_user[uid]
-
             for i, rule in enumerate(rules_by_user[uid]):
                 rule_id = rule['rule_id']
-
                 if rule_id in user_enabled_map:
                     if rule.get('enabled', True) != bool(user_enabled_map[rule_id]):
                         # Rules are cached across users.
diff --git a/synapse/storage/push_rule.py b/synapse/storage/push_rule.py
index d2bf7f2aec..f285f59afd 100644
--- a/synapse/storage/push_rule.py
+++ b/synapse/storage/push_rule.py
@@ -14,7 +14,7 @@
 # limitations under the License.
 
 from ._base import SQLBaseStore
-from synapse.util.caches.descriptors import cachedInlineCallbacks
+from synapse.util.caches.descriptors import cachedInlineCallbacks, cachedList
 from twisted.internet import defer
 
 import logging
@@ -24,7 +24,7 @@ logger = logging.getLogger(__name__)
 
 
 class PushRuleStore(SQLBaseStore):
-    @cachedInlineCallbacks()
+    @cachedInlineCallbacks(lru=True)
     def get_push_rules_for_user(self, user_id):
         rows = yield self._simple_select_list(
             table="push_rules",
@@ -44,7 +44,7 @@ class PushRuleStore(SQLBaseStore):
 
         defer.returnValue(rows)
 
-    @cachedInlineCallbacks()
+    @cachedInlineCallbacks(lru=True)
     def get_push_rules_enabled_for_user(self, user_id):
         results = yield self._simple_select_list(
             table="push_rules_enable",
@@ -60,7 +60,8 @@ class PushRuleStore(SQLBaseStore):
             r['rule_id']: False if r['enabled'] == 0 else True for r in results
         })
 
-    @defer.inlineCallbacks
+    @cachedList(cached_method_name="get_push_rules_for_user",
+                list_name="user_ids", num_args=1, inlineCallbacks=True)
     def bulk_get_push_rules(self, user_ids):
         if not user_ids:
             defer.returnValue({})
@@ -75,13 +76,16 @@ class PushRuleStore(SQLBaseStore):
             desc="bulk_get_push_rules",
         )
 
-        rows.sort(key=lambda e: (-e["priority_class"], -e["priority"]))
+        rows.sort(
+            key=lambda row: (-int(row["priority_class"]), -int(row["priority"]))
+        )
 
         for row in rows:
             results.setdefault(row['user_name'], []).append(row)
         defer.returnValue(results)
 
-    @defer.inlineCallbacks
+    @cachedList(cached_method_name="get_push_rules_enabled_for_user",
+                list_name="user_ids", num_args=1, inlineCallbacks=True)
     def bulk_get_push_rules_enabled(self, user_ids):
         if not user_ids:
             defer.returnValue({})