summary refs log tree commit diff
path: root/synapse/notifier.py
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2014-08-29 16:01:01 +0100
committerErik Johnston <erik@matrix.org>2014-08-29 16:01:01 +0100
commitf07f538ac7e13c354ee98fc548291ac5f8637481 (patch)
treea517ae20a3d013a4a3e2333f21c86d4f1acd0630 /synapse/notifier.py
parentBump version and change log (diff)
downloadsynapse-f07f538ac7e13c354ee98fc548291ac5f8637481.tar.xz
When notifying listeners, don't do so in a serial fashion
Diffstat (limited to 'synapse/notifier.py')
-rw-r--r--synapse/notifier.py21
1 files changed, 19 insertions, 2 deletions
diff --git a/synapse/notifier.py b/synapse/notifier.py
index b6d5ec4820..253f60983b 100644
--- a/synapse/notifier.py
+++ b/synapse/notifier.py
@@ -106,7 +106,9 @@ class Notifier(object):
 
         # TODO (erikj): Can we make this more efficient by hitting the
         # db once?
-        for listener in listeners:
+
+        @defer.inlineCallbacks
+        def notify(listener):
             events, end_token = yield source.get_new_events_for_user(
                 listener.user,
                 listener.from_token,
@@ -118,6 +120,13 @@ class Notifier(object):
                     self, events, listener.from_token, end_token
                 )
 
+        def eb(failure):
+            logger.exception("Failed to notify listener", failure)
+
+        yield defer.DeferredList(
+            [notify(l).addErrback(eb) for l in listeners]
+        )
+
     @defer.inlineCallbacks
     @log_function
     def on_new_user_event(self, users=[], rooms=[]):
@@ -136,7 +145,8 @@ class Notifier(object):
         for room in rooms:
             listeners |= self.rooms_to_listeners.get(room, set()).copy()
 
-        for listener in listeners:
+        @defer.inlineCallbacks
+        def notify(listener):
             events, end_token = yield source.get_new_events_for_user(
                 listener.user,
                 listener.from_token,
@@ -148,6 +158,13 @@ class Notifier(object):
                     self, events, listener.from_token, end_token
                 )
 
+        def eb(failure):
+            logger.exception("Failed to notify listener", failure)
+
+        yield defer.DeferredList(
+            [notify(l).addErrback(eb) for l in listeners]
+        )
+
     def get_events_for(self, user, rooms, pagination_config, timeout):
         """ For the given user and rooms, return any new events for them. If
         there are no new events wait for up to `timeout` milliseconds for any