-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Optimise calculating device_list changes in /sync
.
#11974
Changes from 7 commits
d80f315
7ca292e
d5d3f34
4f965f0
e44bd6d
71868b6
32b36e8
211f50e
beb509e
4967247
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Optimise calculating device_list changes in `/sync`. |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -504,6 +504,68 @@ def _get_rooms_for_user_with_stream_ordering_txn( | |
for room_id, instance, stream_id in txn | ||
) | ||
|
||
@cachedList( | ||
cached_method_name="get_rooms_for_user_with_stream_ordering", | ||
list_name="user_ids", | ||
) | ||
async def get_rooms_for_users_with_stream_ordering( | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. may want a little docstring here, mostly for the return type, which is not very obvious. It's roughly … seems to be the position of the event that gives the user their membership in the room? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do we have no need to invalidate this if a user leaves or so on? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah, missed that this didn't have a docstring. I think you're missing that this is using a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oooh, I see, very cute. That makes sense! |
||
self, user_ids: Collection[str] | ||
) -> Dict[str, FrozenSet[GetRoomsForUserWithStreamOrdering]]: | ||
"""A batched version of `get_rooms_for_user_with_stream_ordering`. | ||
|
||
Returns: | ||
Map from user_id to set of rooms that is currently in. | ||
""" | ||
return await self.db_pool.runInteraction( | ||
"get_rooms_for_users_with_stream_ordering", | ||
self._get_rooms_for_users_with_stream_ordering_txn, | ||
user_ids, | ||
) | ||
|
||
def _get_rooms_for_users_with_stream_ordering_txn( | ||
self, txn, user_ids: Collection[str] | ||
) -> Dict[str, FrozenSet[GetRoomsForUserWithStreamOrdering]]: | ||
|
||
clause, args = make_in_list_sql_clause( | ||
self.database_engine, | ||
"c.state_key", | ||
user_ids, | ||
) | ||
|
||
if self._current_state_events_membership_up_to_date: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Are we stuck with this thing until the rest of time? I'm guessing it's some kind of optimisation we came up with that got populated in the background? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. At some point I think we can change it from a background update to happen synchronously? Or require that people upgrade from vX -> vY and then vY -> vZ? I think we've done something along these lines before? |
||
sql = f""" | ||
SELECT c.state_key, room_id, e.instance_name, e.stream_ordering | ||
FROM current_state_events AS c | ||
INNER JOIN events AS e USING (room_id, event_id) | ||
WHERE | ||
c.type = 'm.room.member' | ||
AND c.membership = ? | ||
AND {clause} | ||
""" | ||
else: | ||
sql = """ | ||
SELECT c.state_key, room_id, e.instance_name, e.stream_ordering | ||
FROM current_state_events AS c | ||
INNER JOIN room_memberships AS m USING (room_id, event_id) | ||
INNER JOIN events AS e USING (room_id, event_id) | ||
WHERE | ||
c.type = 'm.room.member' | ||
AND m.membership = ? | ||
AND {clause} | ||
""" | ||
|
||
txn.execute(sql, [Membership.JOIN] + args) | ||
|
||
result = {user_id: set() for user_id in user_ids} | ||
for user_id, room_id, instance, stream_id in txn: | ||
result[user_id].add( | ||
GetRoomsForUserWithStreamOrdering( | ||
room_id, PersistedEventPosition(instance, stream_id) | ||
) | ||
) | ||
|
||
return {user_id: frozenset(v) for user_id, v in result.items()} | ||
|
||
async def get_users_server_still_shares_room_with( | ||
self, user_ids: Collection[str] | ||
) -> Set[str]: | ||
|
Uh oh!
There was an error while loading. Please reload this page.