forked from MirrorHub/synapse
Merge pull request #6159 from matrix-org/erikj/cache_memberships
Cache room membership lookups in _get_joined_users_from_context
This commit is contained in:
commit
86f4705866
2 changed files with 46 additions and 19 deletions
1
changelog.d/6159.misc
Normal file
1
changelog.d/6159.misc
Normal file
|
@ -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.types import get_domain_from_id
|
||||||
from synapse.util.async_helpers import Linearizer
|
from synapse.util.async_helpers import Linearizer
|
||||||
from synapse.util.caches import intern_string
|
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.metrics import Measure
|
||||||
from synapse.util.stringutils import to_ascii
|
from synapse.util.stringutils import to_ascii
|
||||||
|
|
||||||
|
@ -572,25 +572,10 @@ class RoomMemberWorkerStore(EventsWorkerStore):
|
||||||
missing_member_event_ids.append(event_id)
|
missing_member_event_ids.append(event_id)
|
||||||
|
|
||||||
if missing_member_event_ids:
|
if missing_member_event_ids:
|
||||||
rows = yield self._simple_select_many_batch(
|
event_to_memberships = yield self._get_joined_profiles_from_event_ids(
|
||||||
table="room_memberships",
|
missing_member_event_ids
|
||||||
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
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
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 is not None and event.type == EventTypes.Member:
|
||||||
if event.membership == Membership.JOIN:
|
if event.membership == Membership.JOIN:
|
||||||
|
@ -602,6 +587,47 @@ class RoomMemberWorkerStore(EventsWorkerStore):
|
||||||
|
|
||||||
return users_in_room
|
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)
|
@cachedInlineCallbacks(max_entries=10000)
|
||||||
def is_host_joined(self, room_id, host):
|
def is_host_joined(self, room_id, host):
|
||||||
if "%" in host or "_" in host:
|
if "%" in host or "_" in host:
|
||||||
|
|
Loading…
Reference in a new issue