Faster room joins: make `/joined_members` block whilst the room is partial stated. (#13514)

1.103.0-whithout-watcha
reivilibre 2 years ago committed by GitHub
parent 5442891cbc
commit c3516e9dec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      changelog.d/13514.bugfix
  2. 6
      synapse/handlers/message.py
  3. 13
      synapse/storage/controllers/state.py
  4. 3
      synapse/storage/databases/main/roommember.py

@ -0,0 +1 @@
Faster room joins: make `/joined_members` block whilst the room is partial stated.

@ -331,7 +331,11 @@ class MessageHandler:
msg="Getting joined members while not being a current member of the room is forbidden.",
)
users_with_profile = await self.store.get_users_in_room_with_profiles(room_id)
users_with_profile = (
await self._state_storage_controller.get_users_in_room_with_profiles(
room_id
)
)
# If this is an AS, double check that they are allowed to see the members.
# This can either be because the AS user is in the room or because there

@ -30,6 +30,7 @@ from typing import (
from synapse.api.constants import EventTypes
from synapse.events import EventBase
from synapse.logging.opentracing import trace
from synapse.storage.roommember import ProfileInfo
from synapse.storage.state import StateFilter
from synapse.storage.util.partial_state_events_tracker import (
PartialCurrentStateTracker,
@ -506,3 +507,15 @@ class StateStorageController:
await self._partial_state_room_tracker.await_full_state(room_id)
return await self.stores.main.get_current_hosts_in_room(room_id)
async def get_users_in_room_with_profiles(
self, room_id: str
) -> Dict[str, ProfileInfo]:
"""
Get the current users in the room with their profiles.
If the room is currently partial-stated, this will block until the room has
full state.
"""
await self._partial_state_room_tracker.await_full_state(room_id)
return await self.stores.main.get_users_in_room_with_profiles(room_id)

@ -283,6 +283,9 @@ class RoomMemberWorkerStore(EventsWorkerStore):
Returns:
A mapping from user ID to ProfileInfo.
Preconditions:
- There is full state available for the room (it is not partial-stated).
"""
def _get_users_in_room_with_profiles(

Loading…
Cancel
Save