Store presence cachemap in an ordered dict, so that the newer serials will be at the end

This commit is contained in:
Paul "LeoNerd" Evans 2015-05-07 21:27:53 +01:00
parent db0dca2f6f
commit f683b5de47

View file

@ -26,6 +26,7 @@ import synapse.metrics
from ._base import BaseHandler from ._base import BaseHandler
import logging import logging
from collections import OrderedDict
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -143,7 +144,7 @@ class PresenceHandler(BaseHandler):
self._remote_offline_serials = [] self._remote_offline_serials = []
# map any user to a UserPresenceCache # map any user to a UserPresenceCache
self._user_cachemap = {} self._user_cachemap = OrderedDict() # keep them sorted by serial
self._user_cachemap_latest_serial = 0 self._user_cachemap_latest_serial = 0
metrics.register_callback( metrics.register_callback(
@ -165,6 +166,14 @@ class PresenceHandler(BaseHandler):
else: else:
return UserPresenceCache() 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): def registered_user(self, user):
return self.store.create_presence(user.localpart) return self.store.create_presence(user.localpart)
@ -301,7 +310,7 @@ class PresenceHandler(BaseHandler):
def changed_presencelike_data(self, user, state): def changed_presencelike_data(self, user, state):
statuscache = self._get_or_make_usercache(user) 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) statuscache.update(state, serial=self._user_cachemap_latest_serial)
return self.push_presence(user, statuscache=statuscache) 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 # No actual update but we need to bump the serial anyway for the
# event source # event source
self._user_cachemap_latest_serial += 1 self._bump_serial()
statuscache.update({}, serial=self._user_cachemap_latest_serial) statuscache.update({}, serial=self._user_cachemap_latest_serial)
self.push_update_to_local_and_remote( self.push_update_to_local_and_remote(
@ -706,7 +715,7 @@ class PresenceHandler(BaseHandler):
statuscache = self._get_or_make_usercache(user) 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) statuscache.update(state, serial=self._user_cachemap_latest_serial)
if not observers and not room_ids: if not observers and not room_ids: