forked from MirrorHub/synapse
Merge pull request #2671 from matrix-org/rav/room_list_fixes
Reshuffle room list request code
This commit is contained in:
commit
008aa2fc6d
1 changed files with 30 additions and 20 deletions
|
@ -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"]))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue