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

Revert speed up push #2200

Merged
merged 3 commits into from
May 8, 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
27 changes: 19 additions & 8 deletions synapse/push/bulk_push_rule_evaluator.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
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 @@ -66,6 +67,17 @@ 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 @@ -75,14 +87,6 @@ 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 @@ -94,6 +98,13 @@ 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: 0 additions & 13 deletions synapse/storage/account_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -308,16 +308,3 @@ 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", {})
)
18 changes: 15 additions & 3 deletions synapse/storage/push_rule.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from ._base import SQLBaseStore
from synapse.util.caches.descriptors import cachedInlineCallbacks, cachedList
from synapse.push.baserules import list_with_base_rules
from synapse.api.constants import EventTypes
from twisted.internet import defer

import logging
Expand Down Expand Up @@ -184,11 +185,23 @@ def _bulk_get_push_rules_for_room(self, room_id, state_group, current_state_ids,
if uid in local_users_in_room:
user_ids.add(uid)

forgotten = yield self.who_forgot_in_room(
event.room_id, on_invalidate=cache_context.invalidate,
)

for row in forgotten:
user_id = row["user_id"]
event_id = row["event_id"]

mem_id = current_state_ids.get((EventTypes.Member, user_id), None)
if event_id == mem_id:
user_ids.discard(user_id)

rules_by_user = yield self.bulk_get_push_rules(
user_ids, on_invalidate=cache_context.invalidate,
)

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

defer.returnValue(rules_by_user)

Expand Down Expand Up @@ -398,8 +411,7 @@ 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: 19 additions & 0 deletions synapse/visibility.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,25 @@ 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