Don't bother passing the events to the notifier since it isn't using them

This commit is contained in:
Mark Haines 2015-05-11 15:01:51 +01:00
parent 5e3b254dc8
commit e269c511f6

View file

@ -17,6 +17,7 @@ from twisted.internet import defer
from synapse.util.logutils import log_function from synapse.util.logutils import log_function
from synapse.util.logcontext import PreserveLoggingContext from synapse.util.logcontext import PreserveLoggingContext
from synapse.util.async import run_on_reactor
from synapse.types import StreamToken from synapse.types import StreamToken
import synapse.metrics import synapse.metrics
@ -50,13 +51,9 @@ class _NotificationListener(object):
so that it can remove itself from the indexes in the Notifier class. so that it can remove itself from the indexes in the Notifier class.
""" """
def __init__(self, user, rooms, from_token, limit, timeout, deferred, def __init__(self, user, rooms, deferred, appservice=None):
appservice=None):
self.user = user self.user = user
self.appservice = appservice self.appservice = appservice
self.from_token = from_token
self.limit = limit
self.timeout = timeout
self.deferred = deferred self.deferred = deferred
self.rooms = rooms self.rooms = rooms
self.timer = None self.timer = None
@ -64,17 +61,14 @@ class _NotificationListener(object):
def notified(self): def notified(self):
return self.deferred.called return self.deferred.called
def notify(self, notifier, events, start_token, end_token): def notify(self, notifier):
""" Inform whoever is listening about the new events. This will """ Inform whoever is listening about the new events. This will
also remove this listener from all the indexes in the Notifier also remove this listener from all the indexes in the Notifier
it knows about. it knows about.
""" """
result = (events, (start_token, end_token))
try: try:
self.deferred.callback(result) self.deferred.callback(None)
notified_events_counter.inc_by(len(events))
except defer.AlreadyCalledError: except defer.AlreadyCalledError:
pass pass
@ -161,6 +155,7 @@ class Notifier(object):
listening to the room, and any listeners for the users in the listening to the room, and any listeners for the users in the
`extra_users` param. `extra_users` param.
""" """
yield run_on_reactor()
# poke any interested application service. # poke any interested application service.
self.hs.get_handlers().appservice_handler.notify_interested_services( self.hs.get_handlers().appservice_handler.notify_interested_services(
event event
@ -168,8 +163,6 @@ class Notifier(object):
room_id = event.room_id room_id = event.room_id
room_source = self.event_sources.sources["room"]
room_listeners = self.room_to_listeners.get(room_id, set()) room_listeners = self.room_to_listeners.get(room_id, set())
_discard_if_notified(room_listeners) _discard_if_notified(room_listeners)
@ -200,34 +193,12 @@ class Notifier(object):
logger.debug("on_new_room_event listeners %s", listeners) logger.debug("on_new_room_event listeners %s", listeners)
# TODO (erikj): Can we make this more efficient by hitting the
# db once?
@defer.inlineCallbacks
def notify(listener):
events, end_key = yield room_source.get_new_events_for_user(
listener.user,
listener.from_token.room_key,
listener.limit,
)
if events:
end_token = listener.from_token.copy_and_replace(
"room_key", end_key
)
listener.notify(
self, events, listener.from_token, end_token
)
def eb(failure):
logger.exception("Failed to notify listener", failure)
with PreserveLoggingContext(): with PreserveLoggingContext():
yield defer.DeferredList( for listener in listeners:
[notify(l).addErrback(eb) for l in listeners], try:
consumeErrors=True, listener.notify(self)
) except:
logger.exception("Failed to notify listener")
@defer.inlineCallbacks @defer.inlineCallbacks
@log_function @log_function
@ -237,11 +208,7 @@ class Notifier(object):
Will wake up all listeners for the given users and rooms. Will wake up all listeners for the given users and rooms.
""" """
# TODO(paul): This is horrible, having to manually list every event yield run_on_reactor()
# source here individually
presence_source = self.event_sources.sources["presence"]
typing_source = self.event_sources.sources["typing"]
listeners = set() listeners = set()
for user in users: for user in users:
@ -258,51 +225,12 @@ class Notifier(object):
listeners |= room_listeners listeners |= room_listeners
@defer.inlineCallbacks
def notify(listener):
presence_events, presence_end_key = (
yield presence_source.get_new_events_for_user(
listener.user,
listener.from_token.presence_key,
listener.limit,
)
)
typing_events, typing_end_key = (
yield typing_source.get_new_events_for_user(
listener.user,
listener.from_token.typing_key,
listener.limit,
)
)
if presence_events or typing_events:
end_token = listener.from_token.copy_and_replace(
"presence_key", presence_end_key
).copy_and_replace(
"typing_key", typing_end_key
)
listener.notify(
self,
presence_events + typing_events,
listener.from_token,
end_token
)
def eb(failure):
logger.error(
"Failed to notify listener",
exc_info=(
failure.type,
failure.value,
failure.getTracebackObject())
)
with PreserveLoggingContext(): with PreserveLoggingContext():
yield defer.DeferredList( for listener in listeners:
[notify(l).addErrback(eb) for l in listeners], try:
consumeErrors=True, listener.notify(self)
) except:
logger.exception("Failed to notify listener")
@defer.inlineCallbacks @defer.inlineCallbacks
def wait_for_events(self, user, rooms, timeout, callback, def wait_for_events(self, user, rooms, timeout, callback,
@ -319,9 +247,6 @@ class Notifier(object):
listener = [_NotificationListener( listener = [_NotificationListener(
user=user, user=user,
rooms=rooms, rooms=rooms,
from_token=from_token,
limit=1,
timeout=timeout,
deferred=deferred, deferred=deferred,
appservice=appservice, appservice=appservice,
)] )]
@ -338,7 +263,7 @@ class Notifier(object):
def _timeout_listener(): def _timeout_listener():
timed_out[0] = True timed_out[0] = True
timer[0] = None timer[0] = None
listener[0].notify(self, [], from_token, from_token) listener[0].notify(self)
# We create multiple notification listeners so we have to manage # We create multiple notification listeners so we have to manage
# canceling the timeout ourselves. # canceling the timeout ourselves.
@ -350,10 +275,8 @@ class Notifier(object):
listener[0] = _NotificationListener( listener[0] = _NotificationListener(
user=user, user=user,
rooms=rooms, rooms=rooms,
from_token=from_token,
limit=1,
timeout=timeout,
deferred=deferred, deferred=deferred,
appservice=appservice,
) )
self._register_with_keys(listener[0]) self._register_with_keys(listener[0])
result = yield callback() result = yield callback()