Merge pull request #2671 from matrix-org/rav/room_list_fixes

Reshuffle room list request code
This commit is contained in:
Richard van der Hoff 2017-11-14 18:11:02 +00:00 committed by GitHub
commit 008aa2fc6d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -154,6 +154,8 @@ class RoomListHandler(BaseHandler):
# We want larger rooms to be first, hence negating num_joined_users # We want larger rooms to be first, hence negating num_joined_users
rooms_to_order_value[room_id] = (-num_joined_users, room_id) rooms_to_order_value[room_id] = (-num_joined_users, room_id)
logger.info("Getting ordering for %i rooms since %s",
len(room_ids), stream_token)
yield concurrently_execute(get_order_for_room, room_ids, 10) yield concurrently_execute(get_order_for_room, room_ids, 10)
sorted_entries = sorted(rooms_to_order_value.items(), key=lambda e: e[1]) sorted_entries = sorted(rooms_to_order_value.items(), key=lambda e: e[1])
@ -181,34 +183,42 @@ 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()
# Actually generate the entries. _append_room_entry_to_chunk will append to logger.info("After sorting and filtering, %i rooms remain",
# chunk but will stop if len(chunk) > limit len(rooms_to_scan))
chunk = []
if limit and not search_filter: # _append_room_entry_to_chunk will append to chunk but will stop if
step = limit + 1 # len(chunk) > limit
for i in xrange(0, len(rooms_to_scan), step): #
# We iterate here because the vast majority of cases we'll stop # Normally we will generate enough results on the first iteration here,
# at first iteration, but occaisonally _append_room_entry_to_chunk # but if there is a search filter, _append_room_entry_to_chunk may
# won't append to the chunk and so we need to loop again. # filter some results out, in which case we loop again.
#
# We don't want to scan over the entire range either as that # We don't want to scan over the entire range either as that
# would potentially waste a lot of work. # would potentially waste a lot of work.
#
# XXX if there is no limit, we may end up DoSing the server with
# calls to get_current_state_ids for every single room on the
# server. Surely we should cap this somehow?
#
if limit:
step = limit + 1
else:
step = len(rooms_to_scan)
chunk = []
for i in xrange(0, len(rooms_to_scan), step):
batch = rooms_to_scan[i:i + step]
logger.info("Processing %i rooms for result", len(batch))
yield concurrently_execute( yield concurrently_execute(
lambda r: self._append_room_entry_to_chunk( lambda r: self._append_room_entry_to_chunk(
r, rooms_to_num_joined[r], r, rooms_to_num_joined[r],
chunk, limit, search_filter chunk, limit, search_filter
), ),
rooms_to_scan[i:i + step], 10 batch, 5,
) )
logger.info("Now %i rooms in result", len(chunk))
if len(chunk) >= limit + 1: if len(chunk) >= limit + 1:
break break
else:
yield concurrently_execute(
lambda r: self._append_room_entry_to_chunk(
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"]))