Commit 52cd8f4b authored by mathieui's avatar mathieui
Browse files

Don’t trigger presence events on MUC presence

Specifically, previously, each MUC would be added as a roster item, and
then each join presence would be counted as a resource of that item,
triggering 1 to 5 events and more backend logic in slixmpp.

As a result, joining big rooms is tremendously slow, (JID() calls,
event() calls, __getitem__ calls for nothing), and takes RAM (a quick
tracemalloc tells me around 1 MiB for 3500 participants, i.e. 2 big IRC
rooms). Those resources may not necessarily be cleaned properly, leading
to memory leaks on long-term usage.

This is a micro-optimization that adds an attribute to roster items so
that MUC room events can be ignored safely while not affecting common
roster usage.
parent e28318c2
......@@ -752,6 +752,9 @@ class BaseXMPP(XMLStream):
Update the roster with presence information.
"""
if self.roster[presence['from']].ignore_updates:
return
if not self.is_component and not presence['to'].bare:
presence['to'] = self.boundjid
......
......@@ -160,6 +160,7 @@ class XEP_0045(BasePlugin):
got_online = False
if pr['muc']['room'] not in self.rooms.keys():
return
self.xmpp.roster[pr['from']].ignore_updates = True
entry = pr['muc'].get_stanza_values()
entry['show'] = pr['show']
entry['status'] = pr['status']
......
......@@ -56,6 +56,7 @@ class RosterNode(object):
self.xmpp = xmpp
self.jid = jid
self.db = db
self.ignore_updates = False
self.auto_authorize = True
self.auto_subscribe = True
self.last_status = None
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment