When notifying listeners, don't do so in a serial fashion

This commit is contained in:
Erik Johnston 2014-08-29 16:01:01 +01:00
parent 463b95f0c2
commit f07f538ac7
1 changed files with 19 additions and 2 deletions

View File

@ -106,7 +106,9 @@ class Notifier(object):
# TODO (erikj): Can we make this more efficient by hitting the # TODO (erikj): Can we make this more efficient by hitting the
# db once? # db once?
for listener in listeners:
@defer.inlineCallbacks
def notify(listener):
events, end_token = yield source.get_new_events_for_user( events, end_token = yield source.get_new_events_for_user(
listener.user, listener.user,
listener.from_token, listener.from_token,
@ -118,6 +120,13 @@ class Notifier(object):
self, events, listener.from_token, end_token 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 @defer.inlineCallbacks
@log_function @log_function
def on_new_user_event(self, users=[], rooms=[]): def on_new_user_event(self, users=[], rooms=[]):
@ -136,7 +145,8 @@ class Notifier(object):
for room in rooms: for room in rooms:
listeners |= self.rooms_to_listeners.get(room, set()).copy() 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( events, end_token = yield source.get_new_events_for_user(
listener.user, listener.user,
listener.from_token, listener.from_token,
@ -148,6 +158,13 @@ class Notifier(object):
self, events, listener.from_token, end_token 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): def get_events_for(self, user, rooms, pagination_config, timeout):
""" For the given user and rooms, return any new events for them. If """ 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 there are no new events wait for up to `timeout` milliseconds for any