diff --git a/changelog.d/17696.misc b/changelog.d/17696.misc
new file mode 100644
index 0000000000..a2f1b1f399
--- /dev/null
+++ b/changelog.d/17696.misc
@@ -0,0 +1 @@
+Speed up sliding sync requests a bit where there are many room changes.
diff --git a/synapse/handlers/sliding_sync/__init__.py b/synapse/handlers/sliding_sync/__init__.py
index 04493494a6..c3b5bbbf6f 100644
--- a/synapse/handlers/sliding_sync/__init__.py
+++ b/synapse/handlers/sliding_sync/__init__.py
@@ -267,7 +267,7 @@ class SlidingSyncHandler:
if relevant_rooms_to_send_map:
with start_active_span("sliding_sync.generate_room_entries"):
- await concurrently_execute(handle_room, relevant_rooms_to_send_map, 10)
+ await concurrently_execute(handle_room, relevant_rooms_to_send_map, 20)
extensions = await self.extensions.get_extensions_response(
sync_config=sync_config,
diff --git a/synapse/handlers/sliding_sync/extensions.py b/synapse/handlers/sliding_sync/extensions.py
index 6f37cc3462..7c2f8a2569 100644
--- a/synapse/handlers/sliding_sync/extensions.py
+++ b/synapse/handlers/sliding_sync/extensions.py
@@ -38,6 +38,7 @@ from synapse.types.handlers.sliding_sync import (
SlidingSyncConfig,
SlidingSyncResult,
)
+from synapse.util.async_helpers import concurrently_execute
if TYPE_CHECKING:
from synapse.server import HomeServer
@@ -534,7 +535,10 @@ class SlidingSyncExtensionHandler:
# For rooms we've previously sent down, but aren't up to date, we
# need to use the from token from the room status.
if previously_rooms:
- for room_id, receipt_token in previously_rooms.items():
+ # Fetch any missing rooms concurrently.
+
+ async def handle_previously_room(room_id: str) -> None:
+ receipt_token = previously_rooms[room_id]
# TODO: Limit the number of receipts we're about to send down
# for the room, if its too many we should TODO
previously_receipts = (
@@ -546,6 +550,10 @@ class SlidingSyncExtensionHandler:
)
fetched_receipts.extend(previously_receipts)
+ await concurrently_execute(
+ handle_previously_room, previously_rooms.keys(), 20
+ )
+
if initial_rooms:
# We also always send down receipts for the current user.
user_receipts = (
|