summary refs log tree commit diff
path: root/synapse/storage
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2016-01-29 16:52:48 +0000
committerErik Johnston <erik@matrix.org>2016-01-29 16:52:48 +0000
commit25c311eaf603cef8cbf9e6501aad83d53c304ebb (patch)
treeba17da62684427cc683c9ef6bb2bf5220d942239 /synapse/storage
parentInvalidate _account_data_stream_cache correctly (diff)
downloadsynapse-25c311eaf603cef8cbf9e6501aad83d53c304ebb.tar.xz
Cache get_room_changes_for_user
Diffstat (limited to 'synapse/storage')
-rw-r--r--synapse/storage/__init__.py4
-rw-r--r--synapse/storage/roommember.py4
-rw-r--r--synapse/storage/stream.py7
3 files changed, 15 insertions, 0 deletions
diff --git a/synapse/storage/__init__.py b/synapse/storage/__init__.py
index ee2153737d..c91c7a3729 100644
--- a/synapse/storage/__init__.py
+++ b/synapse/storage/__init__.py
@@ -131,6 +131,10 @@ class DataStore(RoomMemberStore, RoomStore,
             prefilled_cache=event_cache_prefill,
         )
 
+        self._membership_stream_cache = StreamChangeCache(
+            "MembershipStreamChangeCache", events_max,
+        )
+
         account_max = self._account_data_id_gen.get_max_token(None)
         self._account_data_stream_cache = StreamChangeCache(
             "AccountDataAndTagsChangeCache", account_max,
diff --git a/synapse/storage/roommember.py b/synapse/storage/roommember.py
index 1d3e004c90..3065b0c1a5 100644
--- a/synapse/storage/roommember.py
+++ b/synapse/storage/roommember.py
@@ -58,6 +58,10 @@ class RoomMemberStore(SQLBaseStore):
             txn.call_after(self.get_rooms_for_user.invalidate, (event.state_key,))
             txn.call_after(self.get_joined_hosts_for_room.invalidate, (event.room_id,))
             txn.call_after(self.get_users_in_room.invalidate, (event.room_id,))
+            txn.call_after(
+                self._membership_stream_cache.entity_has_changed,
+                event.state_key, event.internal_metadata.stream_ordering
+            )
 
     def get_room_member(self, user_id, room_id):
         """Retrieve the current state of a room member.
diff --git a/synapse/storage/stream.py b/synapse/storage/stream.py
index e245d2f914..cc9e623608 100644
--- a/synapse/storage/stream.py
+++ b/synapse/storage/stream.py
@@ -252,6 +252,13 @@ class StreamStore(SQLBaseStore):
         if from_key == to_key:
             return defer.succeed([])
 
+        if from_id:
+            has_changed = self._membership_stream_cache.has_entity_changed(
+                user_id, int(from_id)
+            )
+            if not has_changed:
+                return defer.succeed([])
+
         def f(txn):
             if from_id is not None:
                 sql = (