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

Perf: Don't filter events for push #2343

Merged
merged 1 commit into from
Jul 7, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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