diff options
author | Mark Haines <mark.haines@matrix.org> | 2015-04-09 11:07:20 +0100 |
---|---|---|
committer | Mark Haines <mark.haines@matrix.org> | 2015-04-09 11:07:20 +0100 |
commit | 6f9dea7483ed01d17522857c5b103971a0050d8f (patch) | |
tree | 1f0018348d61e619cfbaba51ce799dfbc3717602 /synapse | |
parent | Merge pull request #114 from matrix-org/improve_get_event_cache (diff) | |
download | synapse-6f9dea7483ed01d17522857c5b103971a0050d8f.tar.xz |
SYN-339: Cancel the notifier timeout when the notifier fires
Diffstat (limited to '')
-rw-r--r-- | synapse/notifier.py | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/synapse/notifier.py b/synapse/notifier.py index 12573f3f59..0fa77d28ca 100644 --- a/synapse/notifier.py +++ b/synapse/notifier.py @@ -59,8 +59,8 @@ class _NotificationListener(object): self.limit = limit self.timeout = timeout self.deferred = deferred - self.rooms = rooms + self.timer = None def notified(self): return self.deferred.called @@ -93,6 +93,13 @@ class _NotificationListener(object): self.appservice, set() ).discard(self) + # Cancel the timeout for this notifer if one exists. + if self.timer is not None: + try: + notifier.clock.cancel_call_later(self.timer) + except: + logger.exception("Failed to cancel notifier timer") + class Notifier(object): """ This class is responsible for notifying any listeners when there are @@ -325,14 +332,20 @@ class Notifier(object): self._register_with_keys(listener[0]) result = yield callback() + timer = [None] + if timeout: timed_out = [False] def _timeout_listener(): timed_out[0] = True + timer[0] = None listener[0].notify(self, [], from_token, from_token) - self.clock.call_later(timeout/1000., _timeout_listener) + # We create multiple notification listeners so we have to manage + # canceling the timeout ourselves. + timer[0] = self.clock.call_later(timeout/1000., _timeout_listener) + while not result and not timed_out[0]: yield deferred deferred = defer.Deferred() @@ -347,6 +360,12 @@ class Notifier(object): self._register_with_keys(listener[0]) result = yield callback() + if timer[0] is not None: + try: + self.clock.cancel_call_later(timer[0]) + except: + logger.exception("Failed to cancel notifer timer") + defer.returnValue(result) def get_events_for(self, user, rooms, pagination_config, timeout): @@ -400,8 +419,11 @@ class Notifier(object): if not timeout: _timeout_listener() else: - self.clock.call_later(timeout/1000.0, _timeout_listener) - + # Only add the timer if the listener hasn't been notified + if not listener.notified(): + listener.timer = self.clock.call_later( + timeout/1000.0, _timeout_listener + ) return @log_function |