Use stream_change cache to make get_forward_extremeties_for_room cache more effective

This commit is contained in:
Erik Johnston 2016-09-15 14:27:15 +01:00
parent 55e6fc917c
commit cb3edec6af
3 changed files with 19 additions and 2 deletions

View File

@ -173,7 +173,10 @@ class SlavedEventStore(BaseSlavedStore):
get_room_max_stream_ordering = DataStore.get_room_max_stream_ordering.__func__ get_room_max_stream_ordering = DataStore.get_room_max_stream_ordering.__func__
get_forward_extremeties_for_room = ( get_forward_extremeties_for_room = (
EventFederationStore.__dict__["get_forward_extremeties_for_room"] DataStore.get_forward_extremeties_for_room.__func__
)
_get_forward_extremeties_for_room = (
EventFederationStore.__dict__["_get_forward_extremeties_for_room"]
) )
def stream_positions(self): def stream_positions(self):

View File

@ -344,8 +344,17 @@ class EventFederationStore(SQLBaseStore):
self.get_latest_event_ids_in_room.invalidate, (room_id,) self.get_latest_event_ids_in_room.invalidate, (room_id,)
) )
@cached(max_entries=5000, num_args=2)
def get_forward_extremeties_for_room(self, room_id, stream_ordering): def get_forward_extremeties_for_room(self, room_id, stream_ordering):
# We want to make the cache more effective, so we clamp to the last
# change before the given ordering.
last_change = self._events_stream_cache.get_pos_of_last_change(room_id)
if last_change:
stream_ordering = min(last_change, stream_ordering)
return self._get_forward_extremeties_for_room(room_id, stream_ordering)
@cached(max_entries=5000, num_args=2)
def _get_forward_extremeties_for_room(self, room_id, stream_ordering):
"""For a given room_id and stream_ordering, return the forward """For a given room_id and stream_ordering, return the forward
extremeties of the room at that point in "time". extremeties of the room at that point in "time".

View File

@ -121,3 +121,8 @@ class StreamChangeCache(object):
k, r = self._cache.popitem() k, r = self._cache.popitem()
self._earliest_known_stream_pos = max(k, self._earliest_known_stream_pos) self._earliest_known_stream_pos = max(k, self._earliest_known_stream_pos)
self._entity_to_key.pop(r, None) self._entity_to_key.pop(r, None)
def get_pos_of_last_change(self, entity):
"""Returns the stream pos of the last change for an entitiy, if known.
"""
return self._entity_to_key.get(entity, None)