Handle fact that _generate_room_entry may not return a room entry

pull/1130/head
Erik Johnston 2016-09-17 18:01:54 +01:00
parent a298331de4
commit 81570abfb2
1 changed files with 25 additions and 12 deletions

View File

@ -135,21 +135,34 @@ class RoomListHandler(BaseHandler):
rooms_to_scan = rooms_to_scan[:since_token.current_limit] rooms_to_scan = rooms_to_scan[:since_token.current_limit]
rooms_to_scan.reverse() 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 # Actually generate the entries. _generate_room_entry will append to
# chunk but will stop if len(chunk) > limit # chunk but will stop if len(chunk) > limit
chunk = [] chunk = []
yield concurrently_execute( if limit and not search_filter:
lambda r: self._generate_room_entry( step = limit + 1
r, rooms_to_num_joined[r], for i in xrange(0 , len(rooms_to_scan), step):
chunk, limit, search_filter # We iterate here because the vast majority of cases we'll stop
), # at first iteration, but occaisonally _generate_room_entry
rooms_to_scan, 10 # 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"])) chunk.sort(key=lambda e: (-e["num_joined_members"], e["room_id"]))