Perf: Don't filter events for push
We know the users are joined and we can explicitly check for if they are ignoring the user, so lets do that.
This commit is contained in:
parent
58dc1f2c78
commit
f502b0dea1
|
@ -19,7 +19,6 @@ from twisted.internet import defer
|
||||||
|
|
||||||
from .push_rule_evaluator import PushRuleEvaluatorForEvent
|
from .push_rule_evaluator import PushRuleEvaluatorForEvent
|
||||||
|
|
||||||
from synapse.visibility import filter_events_for_clients_context
|
|
||||||
from synapse.api.constants import EventTypes, Membership
|
from synapse.api.constants import EventTypes, Membership
|
||||||
from synapse.util.caches.descriptors import cached
|
from synapse.util.caches.descriptors import cached
|
||||||
from synapse.util.async import Linearizer
|
from synapse.util.async import Linearizer
|
||||||
|
@ -92,15 +91,6 @@ class BulkPushRuleEvaluator(object):
|
||||||
rules_by_user = yield self._get_rules_for_event(event, context)
|
rules_by_user = yield self._get_rules_for_event(event, context)
|
||||||
actions_by_user = {}
|
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(
|
room_members = yield self.store.get_joined_users_from_context(
|
||||||
event, context
|
event, context
|
||||||
)
|
)
|
||||||
|
@ -110,6 +100,14 @@ class BulkPushRuleEvaluator(object):
|
||||||
condition_cache = {}
|
condition_cache = {}
|
||||||
|
|
||||||
for uid, rules in rules_by_user.iteritems():
|
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
|
display_name = None
|
||||||
profile_info = room_members.get(uid)
|
profile_info = room_members.get(uid)
|
||||||
if profile_info:
|
if profile_info:
|
||||||
|
@ -121,13 +119,6 @@ class BulkPushRuleEvaluator(object):
|
||||||
if event.type == EventTypes.Member and event.state_key == uid:
|
if event.type == EventTypes.Member and event.state_key == uid:
|
||||||
display_name = event.content.get("displayname", None)
|
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:
|
for rule in rules:
|
||||||
if 'enabled' in rule and not rule['enabled']:
|
if 'enabled' in rule and not rule['enabled']:
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -308,3 +308,16 @@ class AccountDataStore(SQLBaseStore):
|
||||||
" WHERE stream_id < ?"
|
" WHERE stream_id < ?"
|
||||||
)
|
)
|
||||||
txn.execute(update_max_id_sql, (next_id, next_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", {})
|
||||||
|
)
|
||||||
|
|
|
@ -188,25 +188,6 @@ def filter_events_for_clients(store, user_tuples, events, event_id_to_state):
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
@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
|
@defer.inlineCallbacks
|
||||||
def filter_events_for_client(store, user_id, events, is_peeking=False):
|
def filter_events_for_client(store, user_id, events, is_peeking=False):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue