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 #2343 from matrix-org/erikj/fastpush
Browse files Browse the repository at this point in the history
Perf: Don't filter events for push
  • Loading branch information
erikjohnston authored Jul 7, 2017
2 parents 58dc1f2 + f502b0d commit 08284c8
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 36 deletions.
25 changes: 8 additions & 17 deletions synapse/push/bulk_push_rule_evaluator.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

from .push_rule_evaluator import PushRuleEvaluatorForEvent

from synapse.visibility import filter_events_for_clients_context
from synapse.api.constants import EventTypes, Membership
from synapse.util.caches.descriptors import cached
from synapse.util.async import Linearizer
Expand Down Expand Up @@ -92,15 +91,6 @@ def action_for_event_by_user(self, event, context):
rules_by_user = yield self._get_rules_for_event(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 rules_by_user]

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 @@ -110,6 +100,14 @@ def action_for_event_by_user(self, event, context):
condition_cache = {}

for uid, rules in rules_by_user.iteritems():
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 @@ -121,13 +119,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", {})
)
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 08284c8

Please sign in to comment.