diff options
author | Erik Johnston <erikj@jki.re> | 2016-09-19 10:13:59 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-19 10:13:59 +0100 |
commit | 39af634dd28963f36beb4e56a888e0a8d96233eb (patch) | |
tree | b1ef2ef571e818cf9f0fa558d0fe009fc0418df1 | |
parent | Enable guest access to POST /publicRooms (diff) | |
parent | PEP8 (diff) | |
download | synapse-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.py | 37 |
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"])) |