summary refs log tree commit diff
diff options
context:
space:
mode:
authorPaul "LeoNerd" Evans <paul@matrix.org>2015-05-07 21:27:53 +0100
committerPaul "LeoNerd" Evans <paul@matrix.org>2015-05-07 21:27:53 +0100
commitf683b5de47ae57a4fb6e9b80ad2f83c34c913486 (patch)
tree545f4ec3e354fd499e112125419739c65e28da82
parentMerge branch 'master' of github.com:matrix-org/synapse into develop (diff)
downloadsynapse-f683b5de47ae57a4fb6e9b80ad2f83c34c913486.tar.xz
Store presence cachemap in an ordered dict, so that the newer serials will be at the end
-rw-r--r--synapse/handlers/presence.py17
1 files changed, 13 insertions, 4 deletions
diff --git a/synapse/handlers/presence.py b/synapse/handlers/presence.py

index 9e15610401..6547e0434e 100644 --- a/synapse/handlers/presence.py +++ b/synapse/handlers/presence.py
@@ -26,6 +26,7 @@ import synapse.metrics from ._base import BaseHandler import logging +from collections import OrderedDict logger = logging.getLogger(__name__) @@ -143,7 +144,7 @@ class PresenceHandler(BaseHandler): self._remote_offline_serials = [] # map any user to a UserPresenceCache - self._user_cachemap = {} + self._user_cachemap = OrderedDict() # keep them sorted by serial self._user_cachemap_latest_serial = 0 metrics.register_callback( @@ -165,6 +166,14 @@ class PresenceHandler(BaseHandler): else: return UserPresenceCache() + def _bump_serial(self, user=None): + self._user_cachemap_latest_serial += 1 + + if user: + # Move to end + cache = self._user_cachemap.pop(user) + self._user_cachemap[user] = cache + def registered_user(self, user): return self.store.create_presence(user.localpart) @@ -301,7 +310,7 @@ class PresenceHandler(BaseHandler): def changed_presencelike_data(self, user, state): statuscache = self._get_or_make_usercache(user) - self._user_cachemap_latest_serial += 1 + self._bump_serial(user=user) statuscache.update(state, serial=self._user_cachemap_latest_serial) return self.push_presence(user, statuscache=statuscache) @@ -323,7 +332,7 @@ class PresenceHandler(BaseHandler): # No actual update but we need to bump the serial anyway for the # event source - self._user_cachemap_latest_serial += 1 + self._bump_serial() statuscache.update({}, serial=self._user_cachemap_latest_serial) self.push_update_to_local_and_remote( @@ -706,7 +715,7 @@ class PresenceHandler(BaseHandler): statuscache = self._get_or_make_usercache(user) - self._user_cachemap_latest_serial += 1 + self._bump_serial(user=user) statuscache.update(state, serial=self._user_cachemap_latest_serial) if not observers and not room_ids: