summary refs log tree commit diff
diff options
context:
space:
mode:
authorErik Johnston <erikj@jki.re>2016-09-19 10:13:59 +0100
committerGitHub <noreply@github.com>2016-09-19 10:13:59 +0100
commit39af634dd28963f36beb4e56a888e0a8d96233eb (patch)
treeb1ef2ef571e818cf9f0fa558d0fe009fc0418df1
parentEnable guest access to POST /publicRooms (diff)
parentPEP8 (diff)
downloadsynapse-39af634dd28963f36beb4e56a888e0a8d96233eb.tar.xz
Merge pull request #1130 from matrix-org/erikj/fix_pubroom_pag
Handle fact that _generate_room_entry may not return a room entry
-rw-r--r--synapse/handlers/room_list.py37
1 files changed, 25 insertions, 12 deletions
diff --git a/synapse/handlers/room_list.py b/synapse/handlers/room_list.py
index a1b2c8a986..5a533682c5 100644
--- a/synapse/handlers/room_list.py
+++ b/synapse/handlers/room_list.py
@@ -135,21 +135,34 @@ class RoomListHandler(BaseHandler):
                 rooms_to_scan = rooms_to_scan[:since_token.current_limit]
                 rooms_to_scan.reverse()
 
-        # If there's no search filter just limit the range since we'll
-        # return the vast majority of things.
-        if limit and not search_filter:
-            rooms_to_scan = rooms_to_scan[:limit + 1]
-
         # Actually generate the entries. _generate_room_entry will append to
         # chunk but will stop if len(chunk) > limit
         chunk = []
-        yield concurrently_execute(
-            lambda r: self._generate_room_entry(
-                r, rooms_to_num_joined[r],
-                chunk, limit, search_filter
-            ),
-            rooms_to_scan, 10
-        )
+        if limit and not search_filter:
+            step = limit + 1
+            for i in xrange(0, len(rooms_to_scan), step):
+                # We iterate here because the vast majority of cases we'll stop
+                # at first iteration, but occaisonally _generate_room_entry
+                # won't append to the chunk and so we need to loop again.
+                # We don't want to scan over the entire range either as that
+                # would potentially waste a lot of work.
+                yield concurrently_execute(
+                    lambda r: self._generate_room_entry(
+                        r, rooms_to_num_joined[r],
+                        chunk, limit, search_filter
+                    ),
+                    rooms_to_scan[i:i + step], 10
+                )
+                if len(chunk) >= limit + 1:
+                    break
+        else:
+            yield concurrently_execute(
+                lambda r: self._generate_room_entry(
+                    r, rooms_to_num_joined[r],
+                    chunk, limit, search_filter
+                ),
+                rooms_to_scan, 5
+            )
 
         chunk.sort(key=lambda e: (-e["num_joined_members"], e["room_id"]))