Merge pull request #6159 from matrix-org/erikj/cache_memberships
Cache room membership lookups in _get_joined_users_from_contextpull/6179/head
						commit
						86f4705866
					
				| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
Add more caching to `_get_joined_users_from_context` DB query.
 | 
			
		||||
| 
						 | 
				
			
			@ -32,7 +32,7 @@ from synapse.storage.events_worker import EventsWorkerStore
 | 
			
		|||
from synapse.types import get_domain_from_id
 | 
			
		||||
from synapse.util.async_helpers import Linearizer
 | 
			
		||||
from synapse.util.caches import intern_string
 | 
			
		||||
from synapse.util.caches.descriptors import cached, cachedInlineCallbacks
 | 
			
		||||
from synapse.util.caches.descriptors import cached, cachedInlineCallbacks, cachedList
 | 
			
		||||
from synapse.util.metrics import Measure
 | 
			
		||||
from synapse.util.stringutils import to_ascii
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -572,25 +572,10 @@ class RoomMemberWorkerStore(EventsWorkerStore):
 | 
			
		|||
                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=missing_member_event_ids,
 | 
			
		||||
                retcols=("user_id", "display_name", "avatar_url"),
 | 
			
		||||
                keyvalues={"membership": Membership.JOIN},
 | 
			
		||||
                batch_size=500,
 | 
			
		||||
                desc="_get_joined_users_from_context",
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
            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
 | 
			
		||||
                }
 | 
			
		||||
            event_to_memberships = yield self._get_joined_profiles_from_event_ids(
 | 
			
		||||
                missing_member_event_ids
 | 
			
		||||
            )
 | 
			
		||||
            users_in_room.update((row for row in event_to_memberships.values() if row))
 | 
			
		||||
 | 
			
		||||
        if event is not None and event.type == EventTypes.Member:
 | 
			
		||||
            if event.membership == Membership.JOIN:
 | 
			
		||||
| 
						 | 
				
			
			@ -602,6 +587,47 @@ class RoomMemberWorkerStore(EventsWorkerStore):
 | 
			
		|||
 | 
			
		||||
        return users_in_room
 | 
			
		||||
 | 
			
		||||
    @cached(max_entries=10000)
 | 
			
		||||
    def _get_joined_profile_from_event_id(self, event_id):
 | 
			
		||||
        raise NotImplementedError()
 | 
			
		||||
 | 
			
		||||
    @cachedList(
 | 
			
		||||
        cached_method_name="_get_joined_profile_from_event_id",
 | 
			
		||||
        list_name="event_ids",
 | 
			
		||||
        inlineCallbacks=True,
 | 
			
		||||
    )
 | 
			
		||||
    def _get_joined_profiles_from_event_ids(self, event_ids):
 | 
			
		||||
        """For given set of member event_ids check if they point to a join
 | 
			
		||||
        event and if so return the associated user and profile info.
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
            event_ids (Iterable[str]): The member event IDs to lookup
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
            Deferred[dict[str, Tuple[str, ProfileInfo]|None]]: Map from event ID
 | 
			
		||||
            to `user_id` and ProfileInfo (or None if not join event).
 | 
			
		||||
        """
 | 
			
		||||
 | 
			
		||||
        rows = yield self._simple_select_many_batch(
 | 
			
		||||
            table="room_memberships",
 | 
			
		||||
            column="event_id",
 | 
			
		||||
            iterable=event_ids,
 | 
			
		||||
            retcols=("user_id", "display_name", "avatar_url", "event_id"),
 | 
			
		||||
            keyvalues={"membership": Membership.JOIN},
 | 
			
		||||
            batch_size=500,
 | 
			
		||||
            desc="_get_membership_from_event_ids",
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        return {
 | 
			
		||||
            row["event_id"]: (
 | 
			
		||||
                row["user_id"],
 | 
			
		||||
                ProfileInfo(
 | 
			
		||||
                    avatar_url=row["avatar_url"], display_name=row["display_name"]
 | 
			
		||||
                ),
 | 
			
		||||
            )
 | 
			
		||||
            for row in rows
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    @cachedInlineCallbacks(max_entries=10000)
 | 
			
		||||
    def is_host_joined(self, room_id, host):
 | 
			
		||||
        if "%" in host or "_" in host:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue