summary refs log tree commit diff
path: root/synapse/handlers/space_summary.py
diff options
context:
space:
mode:
authorPatrick Cloke <clokep@users.noreply.github.com>2021-08-11 14:52:09 -0400
committerGitHub <noreply@github.com>2021-08-11 18:52:09 +0000
commit5acd8b5a960b1c53ce0b9efa304010ec5f0f6682 (patch)
treeb5f0cca42ece5ded2b4000ba72f85cf8bab56d79 /synapse/handlers/space_summary.py
parentClarify error message when joining a restricted room. (#10572) (diff)
downloadsynapse-5acd8b5a960b1c53ce0b9efa304010ec5f0f6682.tar.xz
Expire old spaces summary pagination sessions. (#10574)
Diffstat (limited to 'synapse/handlers/space_summary.py')
-rw-r--r--synapse/handlers/space_summary.py24
1 files changed, 23 insertions, 1 deletions
diff --git a/synapse/handlers/space_summary.py b/synapse/handlers/space_summary.py
index fd76c34695..8c9852bc89 100644
--- a/synapse/handlers/space_summary.py
+++ b/synapse/handlers/space_summary.py
@@ -77,6 +77,8 @@ class _PaginationKey:
 class _PaginationSession:
     """The information that is stored for pagination."""
 
+    # The time the pagination session was created, in milliseconds.
+    creation_time_ms: int
     # The queue of rooms which are still to process.
     room_queue: Deque["_RoomQueueEntry"]
     # A set of rooms which have been processed.
@@ -84,6 +86,9 @@ class _PaginationSession:
 
 
 class SpaceSummaryHandler:
+    # The time a pagination session remains valid for.
+    _PAGINATION_SESSION_VALIDITY_PERIOD_MS = 5 * 60 * 1000
+
     def __init__(self, hs: "HomeServer"):
         self._clock = hs.get_clock()
         self._auth = hs.get_auth()
@@ -108,6 +113,21 @@ class SpaceSummaryHandler:
             "get_room_hierarchy",
         )
 
+    def _expire_pagination_sessions(self):
+        """Expire pagination session which are old."""
+        expire_before = (
+            self._clock.time_msec() - self._PAGINATION_SESSION_VALIDITY_PERIOD_MS
+        )
+        to_expire = []
+
+        for key, value in self._pagination_sessions.items():
+            if value.creation_time_ms < expire_before:
+                to_expire.append(key)
+
+        for key in to_expire:
+            logger.debug("Expiring pagination session id %s", key)
+            del self._pagination_sessions[key]
+
     async def get_space_summary(
         self,
         requester: str,
@@ -312,6 +332,8 @@ class SpaceSummaryHandler:
 
         # If this is continuing a previous session, pull the persisted data.
         if from_token:
+            self._expire_pagination_sessions()
+
             pagination_key = _PaginationKey(
                 requested_room_id, suggested_only, max_depth, from_token
             )
@@ -391,7 +413,7 @@ class SpaceSummaryHandler:
                 requested_room_id, suggested_only, max_depth, next_token
             )
             self._pagination_sessions[pagination_key] = _PaginationSession(
-                room_queue, processed_rooms
+                self._clock.time_msec(), room_queue, processed_rooms
             )
 
         return result