-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Remove cached wrap on _get_joined_users_from_context
method
#13569
Changes from 10 commits
d68bda3
4346425
caab2e1
c4b32ba
b63692d
f992ddf
5f99fe8
63967da
d5a5f7f
8379222
6404481
4e62c46
d630c0c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Remove redundant `_get_joined_users_from_context` cache. Contributed by Nick @ Beeper (@fizzadar). |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -31,7 +31,6 @@ | |
import attr | ||
|
||
from synapse.api.constants import EventTypes, Membership | ||
from synapse.events import EventBase | ||
from synapse.metrics import LaterGauge | ||
from synapse.metrics.background_process_metrics import ( | ||
run_as_background_process, | ||
|
@@ -861,97 +860,54 @@ async def get_mutual_rooms_between_users( | |
|
||
return shared_room_ids or frozenset() | ||
|
||
async def get_joined_user_ids_from_state( | ||
self, room_id: str, state: StateMap[str], state_entry: "_StateCacheEntry" | ||
) -> Set[str]: | ||
state_group: Union[object, int] = state_entry.state_group | ||
if not state_group: | ||
# If state_group is None it means it has yet to be assigned a | ||
# state group, i.e. we need to make sure that calls with a state_group | ||
# of None don't hit previous cached calls with a None state_group. | ||
# To do this we set the state_group to a new object as object() != object() | ||
state_group = object() | ||
async def get_joined_users_from_state( | ||
self, room_id: str, state: StateMap[str] | ||
) -> Dict[str, ProfileInfo]: | ||
""" | ||
For a given set of state IDs, get a map of user ID to profile information | ||
for users in the room. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It doesn't return profile information any more! |
||
|
||
This method doesn't do any fetching of data itself and instead checks various | ||
caches for the relevant data before passing any remaining missing event IDs to | ||
`_get_joined_profiles_from_event_ids` which does the actual data fetching. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm somewhat confused by what this text means. Possibly not helped by the fact that
... except that it does. Admittedly, under the hood, it uses I think what you mean is something like "This method checks the local event cache, before calling There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
""" | ||
|
||
assert state_group is not None | ||
with Measure(self._clock, "get_joined_users_from_state"): | ||
return await self._get_joined_user_ids_from_context( | ||
room_id, state_group, state, context=state_entry | ||
users_in_room = set() | ||
member_event_ids = [ | ||
e_id | ||
for key, e_id in current_state_ids.items() | ||
if key[0] == EventTypes.Member | ||
] | ||
|
||
# We check if we have any of the member event ids in the event cache | ||
# before we ask the DB | ||
|
||
# We don't update the event cache hit ratio as it completely throws off | ||
# the hit ratio counts. After all, we don't populate the cache if we | ||
# miss it here | ||
event_map = self._get_events_from_local_cache( | ||
member_event_ids, update_metrics=False | ||
) | ||
|
||
@cached(num_args=2, iterable=True, max_entries=100000) | ||
async def _get_joined_user_ids_from_context( | ||
self, | ||
room_id: str, | ||
state_group: Union[object, int], | ||
current_state_ids: StateMap[str], | ||
event: Optional[EventBase] = None, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. context: this also seems to have been unused since #13267. |
||
context: Optional["_StateCacheEntry"] = None, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. note to self/for posterity: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. also: #13267 changed things so that it was always a |
||
) -> Set[str]: | ||
# We don't use `state_group`, it's there so that we can cache based | ||
# on it. However, it's important that it's never None, since two current_states | ||
# with a state_group of None are likely to be different. | ||
assert state_group is not None | ||
|
||
users_in_room = set() | ||
member_event_ids = [ | ||
e_id | ||
for key, e_id in current_state_ids.items() | ||
if key[0] == EventTypes.Member | ||
] | ||
|
||
if context is not None: | ||
# If we have a context with a delta from a previous state group, | ||
# check if we also have the result from the previous group in cache. | ||
# If we do then we can reuse that result and simply update it with | ||
# any membership changes in `delta_ids` | ||
if context.prev_group and context.delta_ids: | ||
prev_res = self._get_joined_user_ids_from_context.cache.get_immediate( | ||
(room_id, context.prev_group), None | ||
missing_member_event_ids = [] | ||
for event_id in member_event_ids: | ||
ev_entry = event_map.get(event_id) | ||
if ev_entry and not ev_entry.event.rejected_reason: | ||
if ev_entry.event.membership == Membership.JOIN: | ||
users_in_room.add(ev_entry.event.state_key) | ||
else: | ||
missing_member_event_ids.append(event_id) | ||
|
||
if missing_member_event_ids: | ||
event_to_memberships = await self._get_user_ids_from_membership_event_ids( | ||
missing_member_event_ids | ||
) | ||
users_in_room.update( | ||
user_id for user_id in event_to_memberships.values() if user_id | ||
) | ||
if prev_res and isinstance(prev_res, set): | ||
users_in_room = prev_res | ||
member_event_ids = [ | ||
e_id | ||
for key, e_id in context.delta_ids.items() | ||
if key[0] == EventTypes.Member | ||
] | ||
for etype, state_key in context.delta_ids: | ||
if etype == EventTypes.Member: | ||
users_in_room.discard(state_key) | ||
|
||
# We check if we have any of the member event ids in the event cache | ||
# before we ask the DB | ||
|
||
# We don't update the event cache hit ratio as it completely throws off | ||
# the hit ratio counts. After all, we don't populate the cache if we | ||
# miss it here | ||
event_map = self._get_events_from_local_cache( | ||
member_event_ids, update_metrics=False | ||
) | ||
|
||
missing_member_event_ids = [] | ||
for event_id in member_event_ids: | ||
ev_entry = event_map.get(event_id) | ||
if ev_entry and not ev_entry.event.rejected_reason: | ||
if ev_entry.event.membership == Membership.JOIN: | ||
users_in_room.add(ev_entry.event.state_key) | ||
else: | ||
missing_member_event_ids.append(event_id) | ||
|
||
if missing_member_event_ids: | ||
event_to_memberships = await self._get_user_ids_from_membership_event_ids( | ||
missing_member_event_ids | ||
) | ||
users_in_room.update( | ||
user_id for user_id in event_to_memberships.values() if user_id | ||
) | ||
|
||
if event is not None and event.type == EventTypes.Member: | ||
if event.membership == Membership.JOIN: | ||
if event.event_id in member_event_ids: | ||
users_in_room.add(event.state_key) | ||
|
||
return users_in_room | ||
return users_in_room | ||
|
||
@cached( | ||
max_entries=10000, | ||
|
@@ -1150,9 +1106,7 @@ async def _get_joined_hosts( | |
else: | ||
# The cache doesn't match the state group or prev state group, | ||
# so we calculate the result from first principles. | ||
joined_user_ids = await self.get_joined_user_ids_from_state( | ||
room_id, state, state_entry | ||
) | ||
joined_user_ids = await self.get_joined_user_ids_from_state(room_id, state) | ||
|
||
cache.hosts_to_joined_users = {} | ||
for user_id in joined_user_ids: | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks like the merge has gone awry here: we're now reverting
get_joined_user_ids_from_state
back toget_joined_users_from_state
(cf #13573)There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Another 🤦 for me today - 6404481 (+ 4e62c46).