diff options
author | Erik Johnston <erik@matrix.org> | 2017-05-02 10:43:34 +0100 |
---|---|---|
committer | Erik Johnston <erik@matrix.org> | 2017-05-03 15:55:54 +0100 |
commit | 7ebf518c028088d1932262649c1042fb76f9d013 (patch) | |
tree | 1a12b02df5a39376c8ea7f4b1c31047d2f061ed2 /synapse/storage/roommember.py | |
parent | Merge pull request #2080 from matrix-org/erikj/filter_speed (diff) | |
download | synapse-7ebf518c028088d1932262649c1042fb76f9d013.tar.xz |
Make get_joined_users faster
Diffstat (limited to '')
-rw-r--r-- | synapse/storage/roommember.py | 54 |
1 files changed, 38 insertions, 16 deletions
diff --git a/synapse/storage/roommember.py b/synapse/storage/roommember.py index 7ad2198d96..46efdfb3e2 100644 --- a/synapse/storage/roommember.py +++ b/synapse/storage/roommember.py @@ -417,25 +417,47 @@ class RoomMemberStore(SQLBaseStore): if key[0] == EventTypes.Member ] - rows = yield self._simple_select_many_batch( - table="room_memberships", - column="event_id", - iterable=member_event_ids, - retcols=['user_id', 'display_name', 'avatar_url'], - keyvalues={ - "membership": Membership.JOIN, - }, - batch_size=500, - desc="_get_joined_users_from_context", + event_map = self._get_events_from_cache( + member_event_ids, + allow_rejected=False, ) - users_in_room = { - to_ascii(row["user_id"]): ProfileInfo( - avatar_url=to_ascii(row["avatar_url"]), - display_name=to_ascii(row["display_name"]), + missing_member_event_ids = [] + users_in_room = {} + for event_id, ev_entry in event_map.iteritems(): + if event_id: + if ev_entry.event.membership == Membership.JOIN: + users_in_room[to_ascii(ev_entry.event.state_key)] = ProfileInfo( + display_name=to_ascii( + ev_entry.event.content.get("displayname", None) + ), + avatar_url=to_ascii( + ev_entry.event.content.get("avatar_url", None) + ), + ) + else: + missing_member_event_ids.append(event_id) + + if missing_member_event_ids: + rows = yield self._simple_select_many_batch( + table="room_memberships", + column="event_id", + iterable=member_event_ids, + retcols=('user_id', 'display_name', 'avatar_url',), + keyvalues={ + "membership": Membership.JOIN, + }, + batch_size=500, + desc="_get_joined_users_from_context", ) - for row in rows - } + + users_in_room.update({ + to_ascii(row["user_id"]): ProfileInfo( + avatar_url=to_ascii(row["avatar_url"]), + display_name=to_ascii(row["display_name"]), + ) + for row in rows + }) if event is not None and event.type == EventTypes.Member: if event.membership == Membership.JOIN: |