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 #2229 from matrix-org/erikj/faster_get_joined
Browse files Browse the repository at this point in the history
Make get_joined_users faster when we have delta state
  • Loading branch information
erikjohnston authored May 17, 2017
2 parents 6fa8148 + 85e8092 commit bf1050f
Showing 1 changed file with 24 additions and 3 deletions.
27 changes: 24 additions & 3 deletions synapse/storage/roommember.py
Original file line number Diff line number Diff line change
Expand Up @@ -387,7 +387,9 @@ def get_joined_users_from_context(self, event, context):
state_group = object()

return self._get_joined_users_from_context(
event.room_id, state_group, context.current_state_ids, event=event,
event.room_id, state_group, context.current_state_ids,
event=event,
context=context,
)

def get_joined_users_from_state(self, room_id, state_group, state_ids):
Expand All @@ -405,19 +407,39 @@ def get_joined_users_from_state(self, room_id, state_group, state_ids):
@cachedInlineCallbacks(num_args=2, cache_context=True, iterable=True,
max_entries=100000)
def _get_joined_users_from_context(self, room_id, state_group, current_state_ids,
cache_context, event=None):
cache_context, event=None, context=None):
# We don't use `state_group`, it's there so that we can cache based
# on it. However, it's important that it's never None, since two current_states
# with a state_group of None are likely to be different.
# See bulk_get_push_rules_for_room for how we work around this.
assert state_group is not None

users_in_room = {}
member_event_ids = [
e_id
for key, e_id in current_state_ids.iteritems()
if key[0] == EventTypes.Member
]

if context is not None:
# If we have a context with a delta from a previous state group,
# check if we also have the result from the previous group in cache.
# If we do then we can reuse that result and simply update it with
# any membership changes in `delta_ids`
if context.prev_group and context.delta_ids:
prev_res = self._get_joined_users_from_context.cache.get(
(room_id, context.prev_group), None
)
if prev_res and isinstance(prev_res, dict):
users_in_room = dict(prev_res)
member_event_ids = [
e_id
for key, e_id in context.delta_ids.iteritems()
if key[0] == EventTypes.Member
]
for etype, state_key in context.delta_ids:
users_in_room.pop(state_key, None)

# We check if we have any of the member event ids in the event cache
# before we ask the DB

Expand All @@ -431,7 +453,6 @@ def _get_joined_users_from_context(self, room_id, state_group, current_state_ids
)

missing_member_event_ids = []
users_in_room = {}
for event_id in member_event_ids:
ev_entry = event_map.get(event_id)
if ev_entry:
Expand Down

0 comments on commit bf1050f

Please sign in to comment.