Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Merge pull request #2080 from matrix-org/erikj/filter_speed
Browse files Browse the repository at this point in the history
Speed up filtering of a single event in push
  • Loading branch information
erikjohnston authored Apr 28, 2017
2 parents 25a96e0 + ab37bef commit 3033261
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 40 deletions.
27 changes: 8 additions & 19 deletions synapse/push/bulk_push_rule_evaluator.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
from .push_rule_evaluator import PushRuleEvaluatorForEvent

from synapse.api.constants import EventTypes
from synapse.visibility import filter_events_for_clients_context


logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -67,17 +66,6 @@ def __init__(self, room_id, rules_by_user, store):
def action_for_event_by_user(self, event, context):
actions_by_user = {}

# None of these users can be peeking since this list of users comes
# from the set of users in the room, so we know for sure they're all
# actually in the room.
user_tuples = [
(u, False) for u in self.rules_by_user.keys()
]

filtered_by_user = yield filter_events_for_clients_context(
self.store, user_tuples, [event], {event.event_id: context}
)

room_members = yield self.store.get_joined_users_from_context(
event, context
)
Expand All @@ -87,6 +75,14 @@ def action_for_event_by_user(self, event, context):
condition_cache = {}

for uid, rules in self.rules_by_user.items():
if event.sender == uid:
continue

if not event.is_state():
is_ignored = yield self.store.is_ignored_by(event.sender, uid)
if is_ignored:
continue

display_name = None
profile_info = room_members.get(uid)
if profile_info:
Expand All @@ -98,13 +94,6 @@ def action_for_event_by_user(self, event, context):
if event.type == EventTypes.Member and event.state_key == uid:
display_name = event.content.get("displayname", None)

filtered = filtered_by_user[uid]
if len(filtered) == 0:
continue

if filtered[0].sender == uid:
continue

for rule in rules:
if 'enabled' in rule and not rule['enabled']:
continue
Expand Down
13 changes: 13 additions & 0 deletions synapse/storage/account_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -308,3 +308,16 @@ def _update_max_stream_id(self, txn, next_id):
" WHERE stream_id < ?"
)
txn.execute(update_max_id_sql, (next_id, next_id))

@cachedInlineCallbacks(num_args=2, cache_context=True, max_entries=5000)
def is_ignored_by(self, ignored_user_id, ignorer_user_id, cache_context):
ignored_account_data = yield self.get_global_account_data_by_type_for_user(
"m.ignored_user_list", ignorer_user_id,
on_invalidate=cache_context.invalidate,
)
if not ignored_account_data:
defer.returnValue(False)

defer.returnValue(
ignored_user_id in ignored_account_data.get("ignored_users", {})
)
5 changes: 3 additions & 2 deletions synapse/storage/push_rule.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ def _bulk_get_push_rules_for_room(self, room_id, state_group, current_state_ids,
user_ids, on_invalidate=cache_context.invalidate,
)

rules_by_user = {k: v for k, v in rules_by_user.items() if v is not None}
rules_by_user = {k: v for k, v in rules_by_user.iteritems() if v is not None}

defer.returnValue(rules_by_user)

Expand Down Expand Up @@ -398,7 +398,8 @@ def delete_push_rule_txn(txn, stream_id, event_stream_ordering):
with self._push_rules_stream_id_gen.get_next() as ids:
stream_id, event_stream_ordering = ids
yield self.runInteraction(
"delete_push_rule", delete_push_rule_txn, stream_id, event_stream_ordering
"delete_push_rule", delete_push_rule_txn, stream_id,
event_stream_ordering,
)

@defer.inlineCallbacks
Expand Down
19 changes: 0 additions & 19 deletions synapse/visibility.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,25 +188,6 @@ def allowed(event, user_id, is_peeking, ignore_list):
})


@defer.inlineCallbacks
def filter_events_for_clients_context(store, user_tuples, events, event_id_to_context):
user_ids = set(u[0] for u in user_tuples)
event_id_to_state = {}
for event_id, context in event_id_to_context.items():
state = yield store.get_events([
e_id
for key, e_id in context.current_state_ids.iteritems()
if key == (EventTypes.RoomHistoryVisibility, "")
or (key[0] == EventTypes.Member and key[1] in user_ids)
])
event_id_to_state[event_id] = state

res = yield filter_events_for_clients(
store, user_tuples, events, event_id_to_state
)
defer.returnValue(res)


@defer.inlineCallbacks
def filter_events_for_client(store, user_id, events, is_peeking=False):
"""
Expand Down

0 comments on commit 3033261

Please sign in to comment.