summary refs log tree commit diff
diff options
context:
space:
mode:
authorNick Mills-Barrett <nick@beeper.com>2022-09-09 19:00:21 +0100
committerGitHub <noreply@github.com>2022-09-09 19:00:21 +0100
commit4c4889cac0e6f7df4689287b9fddea1bf8b15b7f (patch)
tree7d34ca1ffdbf3b9483567092078453ccd3e7382a
parentTag trace with instance name (#13761) (diff)
downloadsynapse-4c4889cac0e6f7df4689287b9fddea1bf8b15b7f.tar.xz
Concurrently collect room unread counts for push badges (#13765)
Most of the time this function is heavily cached, but when that isn't
the case fetching the counts room by room slows down push delivery on
users with many (thousands) of rooms.

Signed off by Nick @ Beeper.
-rw-r--r--changelog.d/13765.misc1
-rw-r--r--synapse/push/push_tools.py13
2 files changed, 11 insertions, 3 deletions
diff --git a/changelog.d/13765.misc b/changelog.d/13765.misc
new file mode 100644

index 0000000000..fdda5cf3b6 --- /dev/null +++ b/changelog.d/13765.misc
@@ -0,0 +1 @@ +Concurrently fetch room push actions when calculating badge counts. Contributed by Nick @ Beeper (@fizzadar). diff --git a/synapse/push/push_tools.py b/synapse/push/push_tools.py
index 6661887d9f..658bf373b7 100644 --- a/synapse/push/push_tools.py +++ b/synapse/push/push_tools.py
@@ -17,6 +17,7 @@ from synapse.events import EventBase from synapse.push.presentable_names import calculate_room_name, name_from_member_event from synapse.storage.controllers import StorageControllers from synapse.storage.databases.main import DataStore +from synapse.util.async_helpers import concurrently_execute async def get_badge_count(store: DataStore, user_id: str, group_by_room: bool) -> int: @@ -25,13 +26,19 @@ async def get_badge_count(store: DataStore, user_id: str, group_by_room: bool) - badge = len(invites) - for room_id in joins: - notifs = await ( - store.get_unread_event_push_actions_by_room_for_user( + room_notifs = [] + + async def get_room_unread_count(room_id: str) -> None: + room_notifs.append( + await store.get_unread_event_push_actions_by_room_for_user( room_id, user_id, ) ) + + await concurrently_execute(get_room_unread_count, joins, 10) + + for notifs in room_notifs: if notifs.notify_count == 0: continue