sketch of an idea to reduce cache misses for get_users_in_room for ASes

This commit is contained in:
Matthew Hodgson
2018-03-30 03:07:12 +01:00
parent 88cc9cc69e
commit 3a5cb40d45
2 changed files with 13 additions and 5 deletions

View File

@@ -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

View File

@@ -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,)
)