Merge branch 'develop' of github.com:matrix-org/synapse into mysql

This commit is contained in:
Erik Johnston 2015-04-08 14:11:07 +01:00
commit 3887350e47
3 changed files with 49 additions and 9 deletions

View file

@ -349,7 +349,7 @@ and port where the server is running. (At the current time synapse does not
support clustering multiple servers into a single logical homeserver). The DNS support clustering multiple servers into a single logical homeserver). The DNS
record would then look something like:: record would then look something like::
$ dig -t srv _matrix._tcp.machine.my.domaine.name $ dig -t srv _matrix._tcp.machine.my.domain.name
_matrix._tcp IN SRV 10 0 8448 machine.my.domain.name. _matrix._tcp IN SRV 10 0 8448 machine.my.domain.name.

View file

@ -62,7 +62,8 @@ class _NotificationListener(object):
self.rooms = rooms self.rooms = rooms
self.pending_notifications = [] def notified(self):
return self.deferred.called
def notify(self, notifier, events, start_token, end_token): def notify(self, notifier, events, start_token, end_token):
""" Inform whoever is listening about the new events. This will """ Inform whoever is listening about the new events. This will
@ -78,11 +79,15 @@ class _NotificationListener(object):
except defer.AlreadyCalledError: except defer.AlreadyCalledError:
pass pass
# Should the following be done be using intrusively linked lists?
# -- erikj
for room in self.rooms: for room in self.rooms:
lst = notifier.room_to_listeners.get(room, set()) lst = notifier.room_to_listeners.get(room, set())
lst.discard(self) lst.discard(self)
notifier.user_to_listeners.get(self.user, set()).discard(self) notifier.user_to_listeners.get(self.user, set()).discard(self)
if self.appservice: if self.appservice:
notifier.appservice_to_listeners.get( notifier.appservice_to_listeners.get(
self.appservice, set() self.appservice, set()
@ -161,10 +166,18 @@ class Notifier(object):
room_source = self.event_sources.sources["room"] room_source = self.event_sources.sources["room"]
listeners = self.room_to_listeners.get(room_id, set()).copy() room_listeners = self.room_to_listeners.get(room_id, set())
_discard_if_notified(room_listeners)
listeners = room_listeners.copy()
for user in extra_users: for user in extra_users:
listeners |= self.user_to_listeners.get(user, set()).copy() user_listeners = self.user_to_listeners.get(user, set())
_discard_if_notified(user_listeners)
listeners |= user_listeners
for appservice in self.appservice_to_listeners: for appservice in self.appservice_to_listeners:
# TODO (kegan): Redundant appservice listener checks? # TODO (kegan): Redundant appservice listener checks?
@ -173,9 +186,13 @@ class Notifier(object):
# receive *invites* for users they are interested in. Does this # receive *invites* for users they are interested in. Does this
# make the room_to_listeners check somewhat obselete? # make the room_to_listeners check somewhat obselete?
if appservice.is_interested(event): if appservice.is_interested(event):
listeners |= self.appservice_to_listeners.get( app_listeners = self.appservice_to_listeners.get(
appservice, set() appservice, set()
).copy() )
_discard_if_notified(app_listeners)
listeners |= app_listeners
logger.debug("on_new_room_event listeners %s", listeners) logger.debug("on_new_room_event listeners %s", listeners)
@ -226,10 +243,18 @@ class Notifier(object):
listeners = set() listeners = set()
for user in users: for user in users:
listeners |= self.user_to_listeners.get(user, set()).copy() user_listeners = self.user_to_listeners.get(user, set())
_discard_if_notified(user_listeners)
listeners |= user_listeners
for room in rooms: for room in rooms:
listeners |= self.room_to_listeners.get(room, set()).copy() room_listeners = self.room_to_listeners.get(room, set())
_discard_if_notified(room_listeners)
listeners |= room_listeners
@defer.inlineCallbacks @defer.inlineCallbacks
def notify(listener): def notify(listener):
@ -427,3 +452,17 @@ class Notifier(object):
listeners = self.room_to_listeners.setdefault(room_id, set()) listeners = self.room_to_listeners.setdefault(room_id, set())
listeners |= new_listeners listeners |= new_listeners
for l in new_listeners:
l.rooms.add(room_id)
def _discard_if_notified(listener_set):
"""Remove any 'stale' listeners from the given set.
"""
to_discard = set()
for l in listener_set:
if l.notified():
to_discard.add(l)
listener_set -= to_discard

View file

@ -36,6 +36,7 @@ logger = logging.getLogger(__name__)
sql_logger = logging.getLogger("synapse.storage.SQL") sql_logger = logging.getLogger("synapse.storage.SQL")
transaction_logger = logging.getLogger("synapse.storage.txn") transaction_logger = logging.getLogger("synapse.storage.txn")
perf_logger = logging.getLogger("synapse.storage.TIME")
metrics = synapse.metrics.get_metrics_for("synapse.storage") metrics = synapse.metrics.get_metrics_for("synapse.storage")
@ -323,7 +324,7 @@ class SQLBaseStore(object):
time_now - time_then, limit=3 time_now - time_then, limit=3
) )
logger.info( perf_logger.info(
"Total database time: %.3f%% {%s} {%s}", "Total database time: %.3f%% {%s} {%s}",
ratio * 100, top_three_counters, top_3_event_counters ratio * 100, top_three_counters, top_3_event_counters
) )