Measure PresenceEventSource.get_new_events

This commit is contained in:
Erik Johnston 2016-02-23 13:49:16 +00:00
parent 9e696bd6a3
commit 56a94ccd9e

View file

@ -835,50 +835,51 @@ class PresenceEventSource(object):
# We don't try and limit the presence updates by the current token, as # We don't try and limit the presence updates by the current token, as
# sending down the rare duplicate is not a concern. # sending down the rare duplicate is not a concern.
user_id = user.to_string() with Measure(self.clock, "Presence.get_new_events"):
if from_key is not None: user_id = user.to_string()
from_key = int(from_key) if from_key is not None:
room_ids = room_ids or [] from_key = int(from_key)
room_ids = room_ids or []
presence = self.hs.get_handlers().presence_handler presence = self.hs.get_handlers().presence_handler
if not room_ids: if not room_ids:
rooms = yield self.store.get_rooms_for_user(user_id) rooms = yield self.store.get_rooms_for_user(user_id)
room_ids = set(e.room_id for e in rooms) room_ids = set(e.room_id for e in rooms)
user_ids_to_check = set() user_ids_to_check = set()
for room_id in room_ids: for room_id in room_ids:
users = yield self.store.get_users_in_room(room_id) users = yield self.store.get_users_in_room(room_id)
user_ids_to_check.update(users) user_ids_to_check.update(users)
plist = yield self.store.get_presence_list_accepted(user.localpart) plist = yield self.store.get_presence_list_accepted(user.localpart)
user_ids_to_check.update([row["observed_user_id"] for row in plist]) user_ids_to_check.update([row["observed_user_id"] for row in plist])
# Always include yourself. Only really matters for when the user is # Always include yourself. Only really matters for when the user is
# not in any rooms, but still. # not in any rooms, but still.
user_ids_to_check.add(user_id) user_ids_to_check.add(user_id)
max_token = self.store.get_current_presence_token() max_token = self.store.get_current_presence_token()
if from_key: if from_key:
user_ids_changed = self.store.presence_stream_cache.get_entities_changed( user_ids_changed = self.store.presence_stream_cache.get_entities_changed(
user_ids_to_check, from_key, user_ids_to_check, from_key,
) )
else: else:
user_ids_changed = user_ids_to_check user_ids_changed = user_ids_to_check
updates = yield presence.current_state_for_users(user_ids_changed) updates = yield presence.current_state_for_users(user_ids_changed)
now = self.clock.time_msec() now = self.clock.time_msec()
defer.returnValue(([ defer.returnValue(([
{ {
"type": "m.presence", "type": "m.presence",
"content": _format_user_presence_state(s, now), "content": _format_user_presence_state(s, now),
} }
for s in updates.values() for s in updates.values()
if include_offline or s.state != PresenceState.OFFLINE if include_offline or s.state != PresenceState.OFFLINE
], max_token)) ], max_token))
def get_current_key(self): def get_current_key(self):
return self.store.get_current_presence_token() return self.store.get_current_presence_token()