sketch of an idea to reduce cache misses for get_users_in_room for ASes
This commit is contained in:
@@ -186,8 +186,13 @@ class ApplicationService(object):
|
||||
|
||||
@cachedInlineCallbacks(num_args=1, cache_context=True)
|
||||
def _matches_user_in_member_list(self, room_id, store, cache_context):
|
||||
|
||||
def invalidate_only_when_as_users_change(room_id, member):
|
||||
if self.is_interested_in_user(member):
|
||||
cache_context.invalidate(room_id)
|
||||
|
||||
member_list = yield store.get_users_in_room(
|
||||
room_id, on_invalidate=cache_context.invalidate
|
||||
room_id, on_invalidate=invalidate_only_when_as_users_change
|
||||
)
|
||||
|
||||
# check joined member events
|
||||
|
||||
@@ -793,6 +793,13 @@ class EventsStore(EventsWorkerStore):
|
||||
self._invalidate_cache_and_stream(
|
||||
txn, self.get_rooms_for_user_with_stream_ordering, (member,)
|
||||
)
|
||||
# we call this once for each member to allow AS workers to
|
||||
# only invalidate their caches when AS members change.
|
||||
# other folks naively using a cached get_users_in_rooms will
|
||||
# just get prodded multiple times and can ignore the member key.
|
||||
self._invalidate_cache_and_stream(
|
||||
txn, self.get_users_in_room, (room_id, member)
|
||||
)
|
||||
|
||||
for host in set(get_domain_from_id(u) for u in members_changed):
|
||||
self._invalidate_cache_and_stream(
|
||||
@@ -802,10 +809,6 @@ class EventsStore(EventsWorkerStore):
|
||||
txn, self.was_host_joined, (room_id, host)
|
||||
)
|
||||
|
||||
self._invalidate_cache_and_stream(
|
||||
txn, self.get_users_in_room, (room_id,)
|
||||
)
|
||||
|
||||
self._invalidate_cache_and_stream(
|
||||
txn, self.get_current_state_ids, (room_id,)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user