diff options
author | Erik Johnston <erik@matrix.org> | 2016-05-31 13:50:19 +0100 |
---|---|---|
committer | Erik Johnston <erik@matrix.org> | 2016-05-31 13:50:19 +0100 |
commit | e77498c8aa29d9d0f8a0b8cf0e1358eaa0edcc7c (patch) | |
tree | ea97d0d4db5283ee122d519d00aac6e9aedab862 | |
parent | Time _get_rules (diff) | |
parent | Add caches to bulk_get_push_rules* (diff) | |
download | synapse-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.py | 9 | ||||
-rw-r--r-- | synapse/storage/push_rule.py | 16 |
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({}) |