summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--synapse/replication/slave/storage/events.py5
-rw-r--r--synapse/storage/event_federation.py11
-rw-r--r--synapse/util/caches/stream_change_cache.py5
3 files changed, 19 insertions, 2 deletions
diff --git a/synapse/replication/slave/storage/events.py b/synapse/replication/slave/storage/events.py
index 842ced02d6..cc32c66792 100644
--- a/synapse/replication/slave/storage/events.py
+++ b/synapse/replication/slave/storage/events.py
@@ -173,7 +173,10 @@ class SlavedEventStore(BaseSlavedStore):
     get_room_max_stream_ordering = DataStore.get_room_max_stream_ordering.__func__
 
     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):
diff --git a/synapse/storage/event_federation.py b/synapse/storage/event_federation.py
index 050b78d652..97d0c26475 100644
--- a/synapse/storage/event_federation.py
+++ b/synapse/storage/event_federation.py
@@ -344,8 +344,17 @@ class EventFederationStore(SQLBaseStore):
                 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):
+        # 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
         extremeties of the room at that point in "time".
 
diff --git a/synapse/util/caches/stream_change_cache.py b/synapse/util/caches/stream_change_cache.py
index 3c051dabc4..5c2a433e41 100644
--- a/synapse/util/caches/stream_change_cache.py
+++ b/synapse/util/caches/stream_change_cache.py
@@ -121,3 +121,8 @@ class StreamChangeCache(object):
                 k, r = self._cache.popitem()
                 self._earliest_known_stream_pos = max(k, self._earliest_known_stream_pos)
                 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)