Cache set of users whose presence the other user should see
This commit is contained in:
parent
e892457a03
commit
f83ac78201
1 changed files with 27 additions and 13 deletions
|
@ -29,6 +29,7 @@ from synapse.api.errors import SynapseError
|
||||||
from synapse.api.constants import PresenceState
|
from synapse.api.constants import PresenceState
|
||||||
from synapse.storage.presence import UserPresenceState
|
from synapse.storage.presence import UserPresenceState
|
||||||
|
|
||||||
|
from synapse.util.caches.descriptors import cachedInlineCallbacks
|
||||||
from synapse.util.logcontext import preserve_fn
|
from synapse.util.logcontext import preserve_fn
|
||||||
from synapse.util.logutils import log_function
|
from synapse.util.logutils import log_function
|
||||||
from synapse.util.metrics import Measure
|
from synapse.util.metrics import Measure
|
||||||
|
@ -1031,7 +1032,6 @@ class PresenceEventSource(object):
|
||||||
# sending down the rare duplicate is not a concern.
|
# sending down the rare duplicate is not a concern.
|
||||||
|
|
||||||
with Measure(self.clock, "presence.get_new_events"):
|
with Measure(self.clock, "presence.get_new_events"):
|
||||||
user_id = user.to_string()
|
|
||||||
if from_key is not None:
|
if from_key is not None:
|
||||||
from_key = int(from_key)
|
from_key = int(from_key)
|
||||||
|
|
||||||
|
@ -1040,18 +1040,7 @@ class PresenceEventSource(object):
|
||||||
|
|
||||||
max_token = self.store.get_current_presence_token()
|
max_token = self.store.get_current_presence_token()
|
||||||
|
|
||||||
plist = yield self.store.get_presence_list_accepted(user.localpart)
|
users_interested_in = yield self._get_interested_in(user, explicit_room_id)
|
||||||
users_interested_in = set(row["observed_user_id"] for row in plist)
|
|
||||||
users_interested_in.add(user_id) # So that we receive our own presence
|
|
||||||
|
|
||||||
users_who_share_room = yield self.store.get_users_who_share_room_with_user(
|
|
||||||
user_id
|
|
||||||
)
|
|
||||||
users_interested_in.update(users_who_share_room)
|
|
||||||
|
|
||||||
if explicit_room_id:
|
|
||||||
user_ids = yield self.store.get_users_in_room(explicit_room_id)
|
|
||||||
users_interested_in.update(user_ids)
|
|
||||||
|
|
||||||
user_ids_changed = set()
|
user_ids_changed = set()
|
||||||
changed = None
|
changed = None
|
||||||
|
@ -1093,6 +1082,31 @@ class PresenceEventSource(object):
|
||||||
def get_pagination_rows(self, user, pagination_config, key):
|
def get_pagination_rows(self, user, pagination_config, key):
|
||||||
return self.get_new_events(user, from_key=None, include_offline=False)
|
return self.get_new_events(user, from_key=None, include_offline=False)
|
||||||
|
|
||||||
|
@cachedInlineCallbacks(num_args=2, cache_context=True)
|
||||||
|
def _get_interested_in(self, user, explicit_room_id, cache_context):
|
||||||
|
"""Returns the set of users that the given user should see presence
|
||||||
|
updates for
|
||||||
|
"""
|
||||||
|
user_id = user.to_string()
|
||||||
|
plist = yield self.store.get_presence_list_accepted(
|
||||||
|
user.localpart, on_invalidate=cache_context.invalidate,
|
||||||
|
)
|
||||||
|
users_interested_in = set(row["observed_user_id"] for row in plist)
|
||||||
|
users_interested_in.add(user_id) # So that we receive our own presence
|
||||||
|
|
||||||
|
users_who_share_room = yield self.store.get_users_who_share_room_with_user(
|
||||||
|
user_id, on_invalidate=cache_context.invalidate,
|
||||||
|
)
|
||||||
|
users_interested_in.update(users_who_share_room)
|
||||||
|
|
||||||
|
if explicit_room_id:
|
||||||
|
user_ids = yield self.store.get_users_in_room(
|
||||||
|
explicit_room_id, on_invalidate=cache_context.invalidate,
|
||||||
|
)
|
||||||
|
users_interested_in.update(user_ids)
|
||||||
|
|
||||||
|
defer.returnValue(users_interested_in)
|
||||||
|
|
||||||
|
|
||||||
def handle_timeouts(user_states, is_mine_fn, syncing_user_ids, now):
|
def handle_timeouts(user_states, is_mine_fn, syncing_user_ids, now):
|
||||||
"""Checks the presence of users that have timed out and updates as
|
"""Checks the presence of users that have timed out and updates as
|
||||||
|
|
Loading…
Reference in a new issue